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

java.io.FileNotFoundException:找不到文件configuration.yml,java,jakarta-ee,dropwizard,Java,Jakarta 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 configuratio

我已经构建了一个包含类和配置文件的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>
线程“main”java.io.FileNotFoundException:File configuration.yml中未找到异常

在io.dropwizard.configuration.FileConfigurationSourceProvider.open(FileConfigurationSourceProvider.java:14)
在io.dropwizard.configuration.ConfigurationFactory.build(ConfigurationFactory.java:75)
在io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:114)中
在io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:63)
在io.dropwizard.cli.cli.run(cli.java:70)
在io.dropwizard.Application.run(Application.java:72)
位于com.flightnetwork.dropwizard.example.HelloWorldApplication.main(HelloWorldApplication.java:10)

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

configuration.yml
位于
/tmp

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

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

EIDT


如果要从jar中的资源读取配置,则可能需要将应用程序配置为使用,而不是传递可以从中获取的,底层接口的方法需要一个
字符串作为参数,因此,您需要在的结果上使用。

我认为不可能在jar中为dropwizard提供yml文件。它需要在文件系统AFAIK上更新:看起来这是可能的,但我留下这个,因为它仍然是一个解决方案

如果不想向外部公开配置详细信息,则需要通过在构造函数中设置默认值,使用配置类对其进行配置。但它变得很难看,因为它太嵌套了。我不喜欢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);   } }

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

只需使用
ResourceConfigurationSourceProvider
以类似方式配置
应用程序

public class MicroUsersApplication extends Application<MicroUsersConfiguration> {

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

}
对于jar根目录中
/com/some/configuration.yml
中的
configuration.yml

java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server com/some/configuration.yml
请注意-路径
com/some/configuration.yml
中没有前导的
/
。看起来,此行为将保留到1.1.0版本:


如果您使用较新的Dropwizard版本,您可以实现自己的
ResourceConfigurationSourceProvider
——这非常简单。

我要做的第一件事是检查文件扩展名,因为它们是隐藏的,因此会引起混淆。它可能是configuration.yml.txt。在命令promptI上检查它的最佳方法我已经检查了文件的扩展名its.yml。@KartikJajal如果您还没有解决您的问题,请查看我的编辑,了解如何从jar内部加载文件。我认为不可能在jar中为dropwizard提供yml文件。它需要放在文件系统AFAIK.yep上,看起来可以在init(Bootstrap)方法上注入自己的SourceProvider。这实际上非常有用。谢谢我已经确认这是工作。我保存了args的一个副本,并使用新的url.tostring()和bootstrap.setConfig…(新的UrlConfig…)对其进行更改。
java -jar target/drop-wizard-0.0.1-SNAPSHOT.jar server com/some/configuration.yml