我正在使用Spring Boot 2并阅读有关externalilzing properties here的文档,我希望我可以通过声明一个同名的os环境变量来覆盖application.properties中变量的值。 / p>
所以我尝试了如下。
首先,在src/main/resources/application.properties
my.prop = hello
myProp = hello
接下来,使用以下内容创建src/main/java/me/Main.java
。
@SpringBootApplication
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
@Value("${my.prop}")
String myDotProp;
@Value("${myProp}")
String myProp;
@Value("${my.env.prop}")
String envDotProp;
@PostConstruct
public void test() {
logger.debug("my.prop : " + myDotProp);
logger.debug("myProp : " + myProp);
logger.debug("my.env.prop : " + envDotProp);
}
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
现在,使用Windows环境变量面板声明3个变量,如下图所示。
最后,运行mvn spring-boot:run
,这就是结果
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.prop : hello
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : myProp : world
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.env.prop : world
请注意
Spring可以看到环境变量,无论变量名中是否有点(。),如myProp
和my.env.prop
只有当名称不包含点(。)时,Spring才能使用同名的os环境变量的值覆盖application.properties
中变量的值如myProp
和my.prop
所示:myProp
的值已成功覆盖world
,但my.prop
的值仍为hello
已声明os env变量my.prop
。
是否有这种行为的原因,是否有办法配置Spring,以便我可以在我的属性变量中使用点,并使用os env变量覆盖它们?
答案 0 :(得分:1)
将环境变量中的 .
替换为 _
。
例如,如果在 Spring Boot 中将属性命名为 my.env.prop
以使用名为 my_env_prop
的环境变量覆盖它,并且 Spring 会自动进行转换。
.
出现问题的原因是某些操作系统不支持环境变量名称中的 .
。
此处讨论的类似问题:How to set a Spring Boot property with an underscore in its name via Environment Variables?