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

时间:2014-11-18 15:04:12

标签: java java-ee dropwizard

我已经构建了一个类和配置文件的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>

4 个答案:

答案 0 :(得分:9)

从Dropwizard 0.9.1版本开始,可以从类路径加载yaml文件。

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

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

来自jar根目录的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版本:Fix #1640: ResourceConfigurationSourceProvider - process a path to the resource in the more sophisticated way

如果你使用更新的Dropwizard版本,你可以实现自己的ResourceConfigurationSourceProvider - 这很简单。

答案 1 :(得分:3)

configuration.yml应该在工作目录中,即在文件系统上,因为这是你尝试阅读它的方式。如果您想从jar文件或类路径中读取它,通常需要使用getResourcegetResourceAstream方法。 (请参阅此类似的questionanswer

<强> EIDT

如果您想从jar中的资源中读取配置,那么您可能希望将应用程序配置为使用UrlConfigurationSourceProvider而不是FileConfigurationSourceProvider并将URL传递给您从getResource获取,底层接口的open方法需要String作为参数,因此您需要对URL#toString的结果使用getResource

答案 2 :(得分:2)

尝试使用绝对路径执行命令,显然configuration.yml不在run文件夹中。

configuration.yml位于/tmp

时的示例
java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server /tmp/configuration.yml

答案 3 :(得分:1)

我不认为可以在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);   } }