我已经构建了一个类和配置文件的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>
答案 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文件或类路径中读取它,通常需要使用getResource或getResourceAstream方法。 (请参阅此类似的question和answer)
<强> 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); } }