前言
在开发中,我们经常会遇到环境问题。例如,开发环境和测试环境和线上环境,其数据库配置等各不相同。针对这种情况,一般我们采用的方式有一下几种:1. 打包后手动替换配置文件;2. 打包后使用CI工具解压-替换-压缩;3. 使用maven profile功能,打包时候就完成环境的分发。初级(菜鸟)一般使用方式1比较多,方式2则是运维喜欢做的事情,而方式3才是最为优雅的方式。本文采用maven profile的方式,结合spring profile,实现打包后即可运行,无需修改文件的效果。
操作步骤
- 配置pom.xml
<profiles>
<profile>
<id>dev</id>
<!--dev为唯一名称,用于标识区分-->
<properties>
<!--profile.active可以换成别的,是一个环境变量值,用于整合srping profile-->
<profile.active>dev</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.active>prod</profile.active>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application*.yml</exclude>
<exclude>**/*.conf</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profile.active}.yml</include>
<include>**/admin-${profile.active}.conf</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
解释:pom中的配置属于maven profile的配置项,其定义了3个环境dev,test和prod,dev是默认环境。使用profile.active
环境变量关联spring profile。
- 配置application.yml
application.yml
spring:
profiles:
active: @profile.active@
application-dev.yml
server:
port: 9004
servlet:
context-path: /resource-manage
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://*.*.*.*:40023/ecs
username: root
password: ****
jpa:
hibernate:
ddl-auto: update
database: mysql
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
servlet:
multipart:
enabled: true
max-file-size: 200MB
max-request-size: 215MB
file-size-threshold: 2KB
rabbitmq:
addresses: ****
username: admin
password: ****
port: 5672
kubernetes:
admin-conf: classpath:k8s/admin-dev.conf
# 工作中心审核地址
approval:
login_url:
approval_url:
username:
md5Password:
application-prod.yml
server:
port: 9004
servlet:
context-path: /resource-manage
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://******:3306/ecs
username:
password:
jpa:
hibernate:
ddl-auto: update
database: mysql
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
servlet:
multipart:
enabled: true
max-file-size: 200MB
max-request-size: 215MB
file-size-threshold: 2KB
rabbitmq:
addresses:
username:
password:
port:
kubernetes:
admin-conf: classpath:k8s/admin-prod.conf
# 工作中心审核地址
approval:
login_url:
approval_url:
username:
md5Password:
application-test.yml
…
解释:对应pom中的3个环境变量,需要有对应的3个yml配置,另外application.yml定义了激活哪个配置,以及一些共同的配置项可以放置在application.yml中。除此以外的2个yml则各自定义自身的配置项,每个文件的后缀名也是固定的格式application-{xxx}.yml
。
- 使用
至此,maven多环境的配置已经完成,打包时候可以使用mvn clean package -P dev
,也可以直接在右侧的打包选项中勾选dev。
补充
以上只解释了不同环境下的配置文件的分发,其实我们还会存在一个问题:资源文件怎么处理?其实以上配置中已经给出答案:上述文件中的kubernetes.admin-conf
是k8s资源文件,程序会加载这个配置文件访问k8s集群,上述配置项中使用**/admin-${profile.active}.conf
进行了资源文件的分发。