Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。
多 profile 使用与切换
【1】多Profile文件
文件名格式:
application-{profile}.properties
默认使用application.properties配置文件。
如下所示,分别创建application-dev.properties和application-prod.properties文件。
- application-dev.properties
server.port=8082
- application-prod.properties
server.port=8083
- application.properties
server.port=8081
spring.profiles.active=dev
在application.properties中激活了application-dev.properties配置文件。
【2】yml多文档快
yml文件中支持使用三个短横线分割文档块的方式。
server:
port: 8082
spring:
profiles:
active: dev
---
spring:
profiles: dev
server:
port: 8083
---
spring:
profiles: prod
server:
port: 8084
---
spring:
profiles: default
server:
port: 80
---
其中default表示未指定时默认使用的配置。
【3】激活指定配置方式
① 配置文件方式
spring:
profiles:
active: dev
或
spring.profiles.active=dev
② 命令行方式
在打包后运行的时候,添加参数:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar
--spring.profiles.active=dev;
③ 编辑Configurations,填写命令行参数或虚拟机参数
maven profile 与 spring profile 结合使用
使用maven的profile功能,我们可以实现多环境配置文件的动态切换,可参考我的上一篇博客。但随着SpringBoot项目越来越火,越来越多人喜欢用SpringBoot的profile功能。但是用SpringBoot的profile功能时,一般我们默认激活的profile肯定是开发环境的profile。当我们打成jar包后,如果在生产环境下运行,就需要在运行这个jar包的命令后面加个命令行参数来指定切换的profile。虽然这样很方便,但是容易忘记加这个参数。
我们可以通过maven的profile功能和SpringBoot的profile功能结合使用。效果为:当maven打包时通过profile指定配置为test环境的配置,那么我们SpringBoot里面默认激活的就是test环境的配置。这样我们只需要打包时指定profile后,直接运行jar就可以,不需要在命令行加参数了。这个效果就和我们普通web项目使用maven的profile的效果类似了。
1. 思路
(1)通过maven的profile功能,在打包的时候,通过-P指定maven激活某个pofile,这个profile里面配置了一个参数activatedProperties,不同的profile里面的这个参数的值不同
(2)SpringBoot的application.properties文件里面spring.profiles.active填的值取上面maven的activatedProperties参数值。
这样能实现的效果为:
示例一:
maven打包命令为 mvn clean package -P test
那么application.properties里面的spring.profiles.active值就是maven中 id为test的profile的activatedProperties参数值
示例二:
maven打包命令为 mvn clean package -P product
那么application.properties里面的spring.profiles.active值就是maven中 id为product的profile的activatedProperties参数值
2. 案例
(1)项目结构介绍
项目结构如下图所示,是个常见的SpringBoot项目结构,不同环境的propertis文件的后缀不同(见图中红框处)
(2)pom文件中配置maven的profile
maven的profile的配置见下面代码
注意:maven的profile中activatedProperties参数值需要和SpringBoot的不同环境Properties文件的后缀一样。
比如开发环境的Properties的文件名为application-develop.properties,那么maven中develop的profile里面的activatedProperties参数值就应该是develop
<profiles>
<profile>
<!-- 开发 -->
<id>develop</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<activatedProperties>develop</activatedProperties>
</properties>
</profile>
<profile>
<!-- 测试 -->
<id>fuy</id>
<properties>
<activatedProperties>fuy</activatedProperties>
</properties>
</profile>
<profile>
<!-- 生产 -->
<id>production</id>
<properties>
<activatedProperties>production</activatedProperties>
</properties>
</profile>
</profiles>
另外,可以在pom.xml里设置只打包需要的环境的配置文件。如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<include>redisson-${profileActive}.yml</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
(3)application.properties中的配置
在application.properties文件中配置SpringBoot默认激活的propertis文件。这时候spring.profiles.active取上面maven的profile里面配置的activatedProperties的值,这个取值要用@符号来取。具体见下面代码
spring.profiles.active=@activatedProperties@
(4)如何打包
打包时用 mvn clean package -P profile的id (最前面的 mvn 可以省略–不过我在eclipse 上加上了 mvn 反而报错…)
如果不加-P参数,那么默认就是true所在的profile
(5)效果图
当我们打包命令为mvn clean package -P production 时,解压后的jar包中application.properties配置文件中spring.profiles.active的值自动变成了production
3. 小结
(1)该方式优点:打包后不需要通过命令行参数来切换不同环境的配置文件,把指定环境的这一步放到了maven打包的命令上
(2)该方式其实是利用了maven的profile功能和SpringBoot的profile相结合使用
application.yml 没有生效的原因总结
如果配置文件确认没有错误但是没有生效首先是要到编译目录去查看是否被编译过去了,如果没有,请先将项目clean在重启
但是idea启动项目时也会先build,又有可能配置文件没有被编译过去,真实坑爹!
另外,yaml文件中的那些坑:
- 冒号:后面必须有空格,下级属性缩进一格(只支持空格不支持制表符tab)
- 保证不能有重复的一级节点。
- 如果参数是以空格开始或结束的字符串,应使用单引号把他包进来。如果一个字符串参数包含特殊字符,也要用单引号包起来。如果字符串中本身包含单引号,则需要用‘’进行转义;如果字符串开头或结尾包含空格,则需要用单引号将整个字符串包裹
- 检查 src/main/resources 的目录位置是否正确(我自己遇到的一个比较坑的。一开始 src/main/resources 目录是和 src/main/webapp 目录在一起的。后来我点击新建 source folder 之后,src/main/resources 目录就和上面的 src/main/java 在一块了,后来 application.yml 就生效了…)
参考
- SpringBoot - 多Profile使用与切换
- Maven的porfile与SpringBoot的profile结合使用详解
- application.yaml中配置没有生效问题解决