Maven环境隔离应用场景及配置

在实际的项目中,我们经常会遇到各种各样的环境,大致可以分为以下四种:

  • 本地开发环境(Local)
  • 开发环境(Dev)
  • 测试环境(Beta)
  • 线上环境(Prod)

在这些环境中,其配置参数往往会有比较大的差异。例如:数据库地址、FTP服务器地址,这些可能都不一样。因此,我们有必要寻找一种合适的手段来解决它。Maven环境隔离就是一种隔离不同环境配置差异的可行方案。

Mavan环境隔离的好处

首先,一个比较重要的好处就是,通过Maven环境隔离,我们可以避免人工修改的弊端,减少重复劳动和出错概率。其次,通过Maven环境隔离,我们可以轻松分环境编译、打包以及部署代码。
鉴于以上最重要的两点,我们有必要尝试一下使用Maven环境隔离。

Maven环境隔离配置

为了使用Maven环境隔离,我们需要在Maven项目的pom.xml文件中进行一些必要的配置。

配置resources节点

pom.xml文件的project节点下的build节点中增加如下配置:

1
2
3
4
5
6
7
8
9
10
11
<resources>
<resource>
<directory>src/main/resources.${deploy.type}</directory>
<excludes>
<exclude>*.jsp</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>

在上述的配置中,主要有以下两点需要注意:

  1. 第一个resource节点配置的是各个环境中特有的,区别于其它环境的配置文件目录,其exclude节点声明排除了jsp这种文件类型,${deploy.type}则是一个变量,代表了不同的环境,在下文中将会讲解其配置。

  2. 第二个resource节点配置的则是各个环境所共有的配置文件目录。
    通过在build节点增加上述配置,我们可以轻松共有公共配置文件,而对各个环境特有的配置进行单独修改。

配置profiles节点

pom.xml文件的project节点下增加如下的profiles节点配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<deploy.type>dev</deploy.type>
</properties>
</profile>
<profile>
<id>beta</id>
<properties>
<deploy.type>beta</deploy.type>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<deploy.type>prod</deploy.type>
</properties>
</profile>
</profiles>

观察上面的配置,可以看到:

  1. 我们在profiles节点下增加了多个profile节点,通过profile节点,我们设置了三个环境:dev、beta、prod
  2. 在properties节点下我们设置前面的环境变量${deploy.type}的值,并且在第一个profile节点下设置activation节点下的activeByDefault值为true,将dev设置为默认的环境。
  3. 在完成以上配置之后,我们还要新建对应的文件夹,并将对于不同环境有差异的配置文件分离为多个文件。配置示例如下,可以看到公共的配置文件都放到了src/main/resources目录下,其余配置文件放在了src/main/resources.${deploy.type}目录下。
    配置文件

通过以上步骤,我们完成了Maven环境隔离的配置。

IDEA中设置默认环境

在IDEA右侧Maven Projects,选中本地开发环境对应的开发环境,点击import change进行更新。
idea设置默认环境

Maven环境隔离编译打包命令

配置Maven环境隔离后,我们可以使用Maven环境隔离编译打包命令,实现定制打包,其参数为-P{环境标识}

  1. 开发环境

    mvn clean package -Dmaven.test.skip=true -Pdev

  2. 测试环境

    mvn clean package -Dmaven.test.skip=true -Pbeta

  3. 线上环境

    mvn clean package -Dmaven.test.skip=true -Pprod