项目地址https://gitee.com/better-code/SpringBoot-Example/springboot05/
Profiles
Spring profiles 配置多环境,就是将一个配置文件拆分成多个配置文件,动态指定一个配置文件生效。
active 和 include
spring:
profiles:
active: dev,server
include: wxconfig,shiro
spring.profiles.active
指定哪一个配置文件生效
spring.profiles.include
无条件的添加该配置,springApplication.setAdditionalProfiles()
也可以提供和include同等的功能。
使用 spring.profiles.active
激活配置文件
下面2种方式都可以激活配置文件
-
application.yml
或application.properties
spring:
profiles:
active: dev
- 命令行
--spring.profiles.active=prod
在执行jar包时指定属性
java -jar xxx.jar --spring.profiles.active=prod
配置多环境
单文件
spring:
profiles:
active: dev
---
## 开发环境
spring:
profiles: dev
## 数据源
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
server:
## 服务器端口
port: 8080
---
## 测试环境
spring:
profiles: test
## 数据源
datasource:
url: jdbc:mysql://192.168.0.152:3306/test
username: root
password: root
server:
## 服务器端口
port: 8090
---
## 正式环境
spring:
profiles: prod
## 数据源
datasource:
url: jdbc:mysql://42.83.32.46:3306/prod
username: root
password: root
server:
## 服务器端口
port: 80
---
表示文档开始的分隔符(也可以使用...
作为文档结束的分隔符),最上面是通用配置,下面3个是不同环境的配置。
多文件
创建不同环境的配置文件 application-dev.yml
、application-test.yml
、application-prod.yml
,将与环境相关的属性放在里面。
不管单文件还是多文件,激活方式都是一样的。都是使用 spring.profiles.active
属性。
Maven 方式
在pom中设置
@
dev
dev
true
test
test
prod
prod
src/main/resources
true
在 application.yml
中设置
spring:
profiles:
active: @spring.profiles.active@
这样的话,平时开发默认的 dev
当打正式环境的jar包时,执行mvn clean package -P prod
,jar包里application.yml的@spring.profiles.active@
就被替换为 prod
了。
maven 资源过滤功能
上面主要用了maven的资源过滤,这里简单讲一下。
pom文件经常有一些 property
,如下
1.8
1.4.0
1.1.10
2.3.2
定义了这些 property
之后,就可以在pom里直接使用了。如
org.apache.shiro
shiro-core
${shiro.version}
使用方式如上:${shiro.version}
要是在pom里定义一个property
,能不能在 application.yml 中也能像pom里那样使用,如
spring:
datasource:
url: ${datasource.url}
maven说可以。只要在pom里这样设置
src/main/resources
true
即开启资源过滤。
在maven进行资源处理时,自动将 src/main/resources
目录中所有文件中出现的 ${datasource.url}
替换为 jdbc:mysql://192.168.0.1:3306/test
。
问题又来了。
不同环境(开发、测试、正式)用的
都不一样,难道每次切换环境都得修改,要是这样的话,用maven资源过滤还有啥用。
maven说:你可以把像 datasource.url
这样与环境相关的属性都放到 profile
里,不同的环境各自拥有一个自己的profile
。平时使用的时候设置一个默认的profile
,在需要的时候使用mvn参数来切换环境。这些与环境相关的属性的用法和一般的属性完全一样。
如下:
dev
dev
true
test
test
prod
prod
这里可以把每一个profile
都看做一个环境。
mvn clean package -P prod
命令后的prod
就表示使用id
为prod
的profile。
还有一个问题,在application.yml 里为什么是 @xxx@
,而不是 ${xxx}
。
因为 ${xxx}
这种形式被 springboot 占用了。比如
name: zhangsan
decription: "This is ${name}'s project"
说这些应该就可以了吧