通过Maven profile实现环境切换,快速部署到正式环境

前言

在开发工作中存在多个环境:开发环境、测试环境、正式环境(生产环境),而每个环境的MySQL、Redis、Rabbitmq、ElasticSearch等配置各不相同,所以每次开发完成部署或者更新都需要手动改变配置文件,尤其是当使用jenkins等相关自动化编译部署的工具的时候,必须要先修改配置文件再上传代码,否则更新就容易出错。解决这个问题常用的方法有:一是通过Git分支,不同环境不同分支,因为配置文件很少修改,所以一般来说合并不会出现问题,另外就算修改了,在提交代码的时候手动合并一下也就可以了。二是通过maven profile,也是本文主要介绍的方式,maven profile方式有个弊端就是每次修改配置文件就需要修改所有的配置文件,好处就是不管什么分支,配置文件都是相同的(在没有修改配置文件的情况下),不用担心切换分支导致环境异常等等。git和maven profile各有优缺点,具体采用哪种可以根据实际情况采用

开始使用Maven profile

创建对应文件夹

使用maven profile需要给不同的环境创建不同的配置文件夹,比如我的项目主要有测试环境和正式环境,所以在resources文件夹创建了2个目录dev(测试环境)和formal(正式环境),同时把配置文件application.yml放入2个文件夹,修改dev的application.yml服务端口为8081,formal的application.yml的服务端口为8080,具体结构如下图

结构图

修改pom.xml文件

首先在pom.xml中创建测试环境和开发环境节点

COPY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<profiles>
<profile>
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>formal</id>
<properties>
<environment>formal</environment>
</properties>
</profile>
</profiles>

其中id节点是环境的名称,environment是自定义节点,节点值就是创建的环境的文件夹名称,activeByDefault表示不指定环境的时候的默认节点

排除文件夹

为不同环境创建的文件夹,在打包的时候是需要将文件夹内的配置文件打包出来,所以我们需要先排除掉不同环境的文件夹,避免打包的时候将所有文件夹也打包进去

COPY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<build>

<resources>

<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>dev/*</exclude>
<exclude>formal/*</exclude>
</excludes>
</resource>

</resources>

</build>
指定配置目录

指定配置文件在那些目录下,主要是指定环境文件夹和classpath里面的配置文件

COPY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources/${environment}</directory>
</resource>
</resources>

</build>

以上代码配置了2个配置文件点,classpath和指定的环境文件夹

COPY
1
2
3
4
5
6
<resource>
<directory>src/main/java</directory>
<includes>
<include>*.xml</include>
</includes>
</resource>

这里是配置存放Java类文件的源文件目录下的所有xml配置文件,这样存放在src/main/java的配置文件也会打包出来

COPY
1
2
3
 <resource>
<directory>src/main/resources/${environment}</directory>
</resource>

是配置的环境文件夹,其中${environment}对应之前配置环境的自定义标签environment

打包

不指定环境的打包就跟以前的打包命令没有任何区别,会使用activeByDefault指定的环境,如果要指定环境,就给mvn添加参数-P{environment},P是大写,如果我要打包正式环境

COPY
1
mvn install -Pformal

中间不需要空格,另外如果是本地测试的话,每次打包之前最好执行一下

COPY
1
mvn clean

清理一下,否则maven可能会有缓存机制,无法打出正确的包,当然在Jenkins上面不会存在这种问题,因为不会说多个环境打包

不完整的完整的配置文件

COPY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>

<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>dev/*</exclude>
<exclude>formal/*</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources/${environment}</directory>
</resource>
</resources>

</build>

<profiles>
<profile>
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>formal</id>
<properties>
<environment>formal</environment>
</properties>
</profile>
</profiles>
Authorship: 作者
Article Link: https://raye.wang/2018/06/22/%E9%80%9A%E8%BF%87Maven-profile%E5%AE%9E%E7%8E%B0%E7%8E%AF%E5%A2%83%E5%88%87%E6%8D%A2%EF%BC%8C%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2%E5%88%B0%E6%AD%A3%E5%BC%8F%E7%8E%AF%E5%A2%83/
Copyright: All posts on this blog are licensed under the CC BY-NC-SA 4.0 license unless otherwise stated. Please cite Raye Blog !