使用dropwizard覆盖带有env变量的服务器连接器配置

Ste*_*NYC 18 java dropwizard

我已经在dw邮件列表上发布了这个问题,但没有得到答案.

我可以假设下面的YML格式不再适用于DW 0.7.0吗?(使用@ char插入env var)

server:
  applicationConnectors:
    - type: http
      bindHost: @OPENSHIFT_DIY_IP@
      port: @OPENSHIFT_DIY_PORT@
Run Code Online (Sandbox Code Playgroud)

错误:

格式错误的YAML在第28行,第17列; 扫描下一个标记时; 找到无法启动任何令牌的字符@'@'.(不要使用@代替缩进); 在'reader',第28行,第17列:bindHost:@ OPENSHIFT_DIY_IP @

所以我决定使用这种格式:

server:
  type: simple
  applicationContextPath: /
  adminContextPath: /admin
  connector:
      type: http
      bindHost: localhost
      port: 8080
Run Code Online (Sandbox Code Playgroud)

并尝试通过jvm选项覆盖它:

java -Ddw.server.connector.bindHost=$OPENSHIFT_DIY_IP -Ddw.server.connector.port=$OPENSHIFT_DIY_PORT -jar target/myapp.jar server myapp.yml
Run Code Online (Sandbox Code Playgroud)

我的本地env变量:

OPENSHIFT_DIY_IP=localhost
OPENSHIFT_DIY_PORT=8080
Run Code Online (Sandbox Code Playgroud)

我从这个设置得到的错误:

线程"main"中的异常java.lang.RuntimeException:java.net.SocketException:org.eclipse.jetty.setuid.SetUIDListener.lifeCycleStarting(SetUIDListener.java:213)中未解析的地址...引起:java.net.SocketException :sun.nio.ch.Net.translateToSocketException(Net.java:157)中未解析的地址... WARN [2014-05-03 20:11:19,412] org.eclipse.jetty.util.component.AbstractLifeCycle:FAILED org .eclipse.jetty.server.Server @ 91b85:java.lang.RuntimeException:java.net.SocketException:未解析的地址

我究竟做错了什么?

War*_*Fox 44

从Dropwizard版本0.8.0开始,您可以从配置yml文件访问环境变量.它还支持在环境变量不可用时设置默认值. 请参阅此处的文档.

// put environment variable inside ${}
// use :- operator to provide default value

dbHost: ${DB_HOST}
dbPort: ${DB_PORT:-1234}
// dbPort = 1234, if DB_PORT environment variable has no value
Run Code Online (Sandbox Code Playgroud)

重要说明:为此,您需要设置SubstitutingSourceProvider一个EnvironmentVariableSubstitutor.

// Enable variable substitution with environment variables
bootstrap.setConfigurationSourceProvider(
    new SubstitutingSourceProvider(
        bootstrap.getConfigurationSourceProvider(),
        new EnvironmentVariableSubstitutor())
);
Run Code Online (Sandbox Code Playgroud)

更新:2017年11月15日正如@EFreak在评论部分中所提到的,如果没有定义环境变量,new EnvironmentVariableSubstitutor()则会抛出UndefinedEnvironmentVariableException,除非您使用https://github.com/dropwizard/dropwizard/blob/master/strict模式设置为dropwizard构型/ SRC /主/ JAVA/IO/dropwizard /配置/ EnvironmentVariableSubstitutor.javafalsenew EnvironmentVariableSubstitutor(false)

  • @Warfox,作为dropwizard`1.1.4`,为了使默认值起作用,你需要使用`new EnvironmentVariableSubstitutor(false)`来禁用严格模式.否则它将抛出`UndefinedEnvironmentVariableException` src:https://github.com/dropwizard/dropwizard/blob/master/dropwizard-configuration/src/main/java/io/dropwizard/configuration/EnvironmentVariableSubstitutor.java (4认同)
  • @StephenNYC这应该是现在接受的答案,因为它内置于dropwizard中 (3认同)

Ste*_*NYC 6

有人为DW 创建了一个,可以嵌入env变种