Spring Boot未读取config目录下的application.properties配置文件问题
我之前也碰到过类似的问题,结合Spring Boot的配置优先级规则,给你几个可行的解决方案:
首先先明确你的场景:你的项目目录结构是这样的
/data/portal/ ├── portal.jar └── config └── application.properties // 期望读取此文件
运行java -jar portal.jar时Spring Boot没加载外部config里的配置,反而用了jar内置的,大概率是这几个原因之一:运行命令的工作目录不对、打包时把config目录打进jar了,或者需要更明确地指定配置路径。
接下来一步步解决:
1. 直接明确指定配置文件路径
最稳妥的方式就是用--spring.config.location参数手动指定外部配置文件的绝对路径,这样Spring Boot会优先加载这个文件:
java -jar portal.jar --spring.config.location=file:/data/portal/config/application.properties
如果你想保留jar内的配置作为 fallback(外部配置里没定义的用jar里的),可以用逗号分隔多个路径:
java -jar portal.jar --spring.config.location=file:/data/portal/config/application.properties,classpath:/application.properties
2. 检查运行命令的工作目录
如果你不是在/data/portal/目录下执行的java -jar命令,比如你在/home目录下运行java -jar /data/portal/portal.jar,那Spring Boot默认会在当前工作目录(也就是/home)下找config目录,而不是jar所在的/data/portal/目录。这种情况要么先cd到/data/portal/再运行命令:
cd /data/portal/ && java -jar portal.jar
要么就用上面的绝对路径指定方式。
3. 排查Maven打包配置
如果你的Maven pom.xml里的resources配置把config目录包含进去了,那打包时这个目录会被打进jar包,导致jar内也有一份application.properties,可能会干扰优先级。你可以调整pom.xml的resources配置,只打包src/main/resources下的内容,排除外部的config目录:
<build> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>config/**</exclude> </excludes> </resource> </resources> </build>
4. 用additional-location补充配置
如果你不想覆盖默认的配置优先级,只是想额外加载外部config目录的配置,可以用--spring.config.additional-location参数,注意路径要以/结尾:
java -jar portal.jar --spring.config.additional-location=file:/data/portal/config/
这个参数会在默认配置路径的基础上,额外加载指定目录下的配置,优先级比默认的外部config目录稍低,但不会覆盖原有规则。
按照上面的步骤来,应该就能解决Spring Boot不读取外部config配置的问题了。
内容的提问来源于stack exchange,提问作者Tiina

