当前位置: 代码迷 >> 综合 >> springboot没有按默认顺序读取配置文件问题
  详细解决方案

springboot没有按默认顺序读取配置文件问题

热度:69   发布时间:2023-10-16 15:49:40.0

众所周知 springboot 读取配置的默认顺序为

  1. 当前项目目录下的一个/config子目录
  2. 当前项目目录
  3. 项目的resources即一个classpath下的/config包
  4. 项目的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>

 

使用默认顺序读取配置文件可能会有不确定因素