Spring Boot 1.4外部属性文件环境变量无法解析取值问题
问题根因
核心问题是conf目录下的application.properties没有被Spring Boot 1.4正确加载,由两个配置错误直接导致:
- classpath顺序配置错误:你把conf目录放在了classpath的最末尾。JVM和Spring加载classpath资源遵循先找到先返回的规则,classpath中越靠前的路径/ jar包优先级越高。你放在前面的
fantasy_fury.jar、dependency下的第三方jar中只要任意一个自带application.properties,Spring加载到第一份配置后就不会再读取后面classpath条目里的同名文件,conf目录下的自定义配置完全不会被解析。 - 配置加载方式不可靠:Spring Boot 1.4对配置文件扫描有固定的优先级规则,手动把目录追加到classpath末尾的方式,很容易受打包结构、第三方依赖包内置配置文件的影响,稳定性极差。
另外zkHost=${ZK_CLUSTER_URLS}这行配置本身是多余的:Spring占位符解析器原生支持直接读取环境变量、JVM系统属性的值,不需要在配置文件里额外转存,这行配置只有在配置文件被成功加载时才会生效。
修复方案
选任意一种即可生效:
- 调整classpath顺序,把自定义conf目录挪到classpath最开头,保证它的优先级高于所有jar包,修改后启动命令:
export ZK_CLUSTER_URLS=madhur1;java -classpath "/home/madhur/github/fantasy_fury/conf:/home/madhur/github/fantasy_fury/target/fantasy_fury.jar:/home/madhur/github/fantasy_fury/target/dependency/*" com.games24x7.fantasy.fury.FantasyFuryInit
- 不需要手动把conf加入classpath,直接通过Spring Boot原生参数指定外部配置路径,完全不受classpath顺序影响,稳定性最高:
export ZK_CLUSTER_URLS=madhur1;java -classpath "/home/madhur/github/fantasy_fury/target/fantasy_fury.jar:/home/madhur/github/fantasy_fury/target/dependency/*" -Dspring.config.location=file:/home/madhur/github/fantasy_fury/conf/ com.games24x7.fantasy.fury.FantasyFuryInit
- 跳过配置文件转存层,直接在@Value中读取环境变量,只要环境变量设置正确就能拿到值,不依赖配置文件加载:
@Value("${ZK_CLUSTER_URLS:localhost}") String zkHost;
排查技巧
如果修改后仍不生效,启动时追加--debug参数,查看启动日志里配置文件的加载路径,确认是否读取到了conf目录下的application.properties即可快速定位问题。
内容的提问来源于stack exchange,提问作者Madhur Ahuja
相关产品推荐
相关产品推荐

