众所周知 springboot 读取配置的默认顺序为
- 当前项目目录下的一个/config子目录
- 当前项目目录
- 项目的resources即一个classpath下的/config包
-
项目的resources即classpath根路径(root)
但是最近遇到个奇葩的问题 看起来 springboot 并没有按这个顺序来读取配置
事情是这样的:
我在 jar 包同级目录有application.yml文件,classpath 下有application.yml,application-pro.yml这两个文件,项目启动时读取了classpath 下的application-pro.yml 这让我小小的眼睛充满了大大的疑惑
为什么会这样:
首先 两个地方的application.yml是不一样的 jar 包同级目录的application.yml并没有配置profiles:active: pro,而 classpath 下的application.yml有这个配置
按照我的理解,项目启动时首先会读取 jar 包同级的application.yml发现没有配置profiles:active就会默认是有 jar 包同级目录的application.yml,但事实并不是这样
实际运行流程:
项目启动读取配置发现 jar 包同级的application.yml没有配置profiles:active就接着往下找找到 classpath 下的application.yml发现配置了profiles:active: pro,于是就开始找application-pro.yml,由于 jar 包同级目录并没有application-pro.yml文件,所以就使用了 classpath 下的application-pro.yml
这导致了我认为 springboot 没有按照默认顺序读取配置文件
结论:
springboot 读取配置文件的默认顺序不是按照文件级别来读取的,而是按照配置项来的,这个文件没有就找下一个文件
会先找profiles:active确认 activeprofile 之后再一层层找配置
比如port 配置activeprofile已经确认为 pro 了之后会先找 jar 包同级的 application-pro.yml port 配置 如果没有 则会使用 classpath 下的application-pro.yml 的 port 配置 如果再没有 会使用application.yml的 port 配置
教训:
最好大家都别靠默认读取配置顺序来指定配置文件,如果想要配置文件分离最好还是打包时排除配置文件
比如
<resources> <resource> <directory>src/main/resources</directory> <!-- <includes>--> <!-- <include>ConfigSource.properties</include>--> <!-- </includes>--> <excludes> <exclude></exclude> </excludes> </resource> </resources>
使用默认顺序读取配置文件可能会有不确定因素