簡體   English   中英

java.io.FileNotFoundException:找不到文件configuration.yml

[英]java.io.FileNotFoundException: File configuration.yml not found

我已經構建了一個類和配置文件的jar文件。 configuration.yml文件位於jar的根目錄中。 當我嘗試使用以下命令運行應用程序時:

java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server configuration.yml

我在下面得到了例外。 如何從命令提示符指定位於jar中的文件?

Exception in thread "main" java.io.FileNotFoundException: File configuration.yml not found <br>
    at io.dropwizard.configuration.FileConfigurationSourceProvider.open(FileConfigurationSourceProvider.java:14)<br>
    at io.dropwizard.configuration.ConfigurationFactory.build(ConfigurationFactory.java:75)<br>
    at io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:114)<br>
    at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:63)<br>
    at io.dropwizard.cli.Cli.run(Cli.java:70)<br>
    at io.dropwizard.Application.run(Application.java:72)<br>
    at com.flightnetwork.dropwizard.example.HelloWorldApplication.main(HelloWorldApplication.java:10)<br>

從Dropwizard 0.9.1版本開始,可以從類路徑加載yaml文件。

只需使用ResourceConfigurationSourceProvider以類似的方式配置Application

public class MicroUsersApplication extends Application<MicroUsersConfiguration> {

    @Override
    public void initialize(Bootstrap<MicroUsersConfiguration> bootstrap) {
        bootstrap.setConfigurationSourceProvider(
            new ResourceConfigurationSourceProvider());
    }

}

對於jar的根目錄中的configuration.yml

java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server configuration.yml

對於configuration.yml/com/some/configuration.yml從罐中根

java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server com/some/configuration.yml

請注意 - 路徑com/some/configuration.yml沒有前導/ 看起來,這種行為將一直保持到1.1.0版本: 修復#1640:ResourceConfigurationSourceProvider - 以更復雜的方式處理資源的路徑

如果你使用更新的Dropwizard版本,你可以實現自己的ResourceConfigurationSourceProvider - 它非常簡單。

configuration.yml應該在工作目錄中,即在文件系統上,因為這是你嘗試閱讀它的方式。 如果你想從jar文件或類路徑中讀取它,你需要使用getResourcegetResourceAstream方法。 (請看這個類似的問題答案

EIDT

如果您想從jar中的資源讀取配置,那么您可能希望將應用程序配置為使用UrlConfigurationSourceProvider而不是FileConfigurationSourceProvider並將其傳遞給您可以從getResource獲取的URL ,底層接口的open方法需要String為參數,所以你需要在getResource的結果上使用URL#toString

嘗試使用絕對路徑執行命令,顯然configuration.yml不在run文件夾中。

configuration.yml/tmp示例

java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server /tmp/configuration.yml

我不認為有可能在jar中輸入dropwizard yml文件。 它需要在文件系統AFAIK上。 更新 :看起來它是可能的,但我離開了它,因為它仍然是一個解決方案。

如果您不想將配置詳細信息公開給外部,則需要使用Configuration類通過在構造函數中設置默認值來配置它。 它變得非常難看,因為它是如此嵌套。 我不喜歡dropwizard如何自己強制執行yml依賴。

我用於測試的一個例子:

public class TestConfiguration extends Configuration {

  public TestConfiguration() {
    super();
    // The following is to make sure it runs with a random port. parallel tests clash otherwise
    ((HttpConnectorFactory) ((DefaultServerFactory) getServerFactory()).getApplicationConnectors().get(0)).setPort(0);
    // this is for admin port
    ((HttpConnectorFactory) ((DefaultServerFactory) getServerFactory()).getAdminConnectors().get(0)).setPort(0);   } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM