Spring External Config Location不生效,请求技术排查协助
解决Spring Boot启动时
spring.config.location参数被忽略的问题 先帮你梳理下当前的部署结构和遇到的问题:
部署结构
├── bin │ ├── stop.sh │ └── start.sh ├── config │ ├── application-dev.properties │ ├── application-local.properties │ ├── application.properties │ └── logback.xml ├── lib ├── myjar.jar └── logs
当前问题
你使用的启动脚本命令是:
jar -jar ../lib/myjar.jar --spring.profiles.active=dev --spring.config.location=file:./../config/
已经成功激活了dev环境配置,但应用仍然使用jar包内部的配置文件,外部config目录下的配置没有生效。
下面几个排查和解决方向可以试试:
1. 修正启动命令的基础错误
首先,运行Jar包的正确命令是java -jar而非jar -jar——jar命令是用来打包/解压Jar文件的工具,不是用来运行应用的。这个错误可能直接导致后续参数没有被Spring Boot正确解析,先把命令改成:
java -jar ../lib/myjar.jar --spring.profiles.active=dev --spring.config.location=file:./../config/
2. 避免相对路径的陷阱,用绝对路径指定配置
你的启动脚本在bin目录,当你从不同目录执行脚本时,./../config/的相对路径会指向不同位置(比如在项目根目录执行bin/start.sh时,路径会变成错误的../config/)。
建议在脚本中通过绝对路径来指定配置目录,这样无论从哪里执行都不会出错:
#!/bin/bash # 获取当前脚本所在的绝对目录 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 用绝对路径构造Jar包和配置目录的路径 java -jar "$SCRIPT_DIR/../lib/myjar.jar" \ --spring.profiles.active=dev \ --spring.config.location="file:$SCRIPT_DIR/../config/"
3. 改用spring.config.additional-location更稳妥
spring.config.location会替换Spring Boot默认的配置加载路径,如果指定的路径有误或找不到文件,应用就会 fallback 到Jar内部的配置。而spring.config.additional-location是在默认加载路径之外额外添加外部配置,优先级比Jar内部的配置更高,容错性更强:
java -jar "$SCRIPT_DIR/../lib/myjar.jar" \ --spring.profiles.active=dev \ --spring.config.additional-location="file:$SCRIPT_DIR/../config/"
4. 开启调试日志查看配置加载过程
如果还是不行,可以添加调试日志参数,查看Spring Boot加载配置的详细过程,确认是否加载到了外部的配置文件:
java -jar "$SCRIPT_DIR/../lib/myjar.jar" \ -Dlogging.level.org.springframework.boot.context.config=DEBUG \ --spring.profiles.active=dev \ --spring.config.additional-location="file:$SCRIPT_DIR/../config/"
启动后查看日志,搜索ConfigDataLocation相关的内容,就能看到Spring Boot尝试加载的所有配置路径,以及哪些文件成功加载了。
5. 直接指定具体配置文件路径
如果只想加载外部的指定配置文件,可以直接指定文件路径,避免目录路径的潜在问题:
java -jar "$SCRIPT_DIR/../lib/myjar.jar" \ --spring.profiles.active=dev \ --spring.config.location="file:$SCRIPT_DIR/../config/application-dev.properties,file:$SCRIPT_DIR/../config/application.properties"
内容的提问来源于stack exchange,提问作者user1472672




