在部署 springboot 项目时,我们大多会采用“配置与服务分离”的形式进行部署,即在实际部署时具体的配置文件可能会在远程服务器上或者宿主机的某个位置(使用分布式配置中心的请揍开)。
不过前提呢,就要求我们在将项目打包成 JAR 包时将 resources 目录下的相关配置文件进行排除。只需要在 pom.xml 中做如下配置即可:
<build><resources><!-- 打包时过滤掉所有 *properties 文件 --><resource><directory>src/main/resources</directory><excludes><exclude>*.properties</exclude></excludes></resource></resources></build>
这个配置就是借助 <excludes> 标签在打包时将 src/main/resources 的所有以 .properties 为后缀的文件进行排除掉。
除了 <excludes> 标签还有 <includes> 标签,如果你想在排除以 .properties 为后缀的文件时又不想排除这些文件中的某一个,就可以使用这个标签。比如不排除主配置文件 application.properties 就可以按照下面的形式写:
<build><resources><!-- 打包时过滤掉所有 *properties 文件 --><resource><directory>src/main/resources</directory><excludes><exclude>*.properties</exclude></excludes><includes><include>application.properties</include></includes></resource><!-- 打包时不过滤 application.properties 文件 --><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>application.properties</include></includes></resource></resources></build>
这样,我们就可以按需要指定配置文件了,在启动时可以使用 -Dspring.config.location= 进行指定具体的配置文件或者多个配置文件所在的文件夹。
springboot 加载配置文件的核心处理类是在 org.springframework.boot.context.config.ConfigFileApplicationListener 的内部类 Loader 中的 load() 方法,感兴趣的可以自己去看下源码。
在源码中定义了一个按顺序加载配置文件的属性常量:
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
也就是说,springboot 加载配置文件的优先级是(优先级从低到高):
classpath:classpath:/configfile:file:config/file:/etc/config
现在就来演示一下。
在前面说了在打包时如何排除配置文件,看下下面的截图:

config 文件夹就是我提取出来的配置文件,现在如果想要指定外部配置文件启动的话我们就可以使用 file: 协议,需要说明的一点是。file: 协议支持相对目录和绝对目录,如下所示:
使用绝对目录:
java -jar docker-web-0.0.1-SNAPSHOT.jar -Dspring.config.location=file:/Users/mingrn97/Desktop/config/
使用相对目录:
java -jar docker-web-0.0.1-SNAPSHOT.jar -Dspring.config.location=config/
注意:上面指定的都是文件夹,就表示会加载文件夹下所有配置文件。如果只想要加载某一个,具体指定即可。
下面是启动日志:

从输出日志中可以看出,默认激活的是 local 配置文件。
如果想要激活 i18n 配置文件怎么办?使用 --spring.profiles.active= 命令即可:

注意:如果使用 JVM 参数 **-Dspring.profiles.active=** 我测试是不生效的。
完结,撒花~
参考:
