Filtering

Filtering是maven的resource插件提供的功能,作用是用环境变量、pom文件里定义的属性和指定配置文件里的属性替换属性文件(*.properties)里的占位符(如${jdbc.url})

Profile

是pom文件里的一个xml元素,在profile里几乎可以定义所有在pom里的定义的内容(如depencency,build,properties等,但不能再定义profile)。当一个profile被激活时,它定义的等就会覆盖掉原pom里定义的相同内容,从而可以通过激活不同的profile来使用不同的配置。

Filtering + Profile管理不同环境的配置

为每个环境定义profile,以及对应的属性(properties)。构建时通过激活相应的profile,用其中的属性去替换application.properties里的占位符。

定义profile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<project>
  <profiles>
    <profile>
      <id>dev</id>
      <properties>  
        <!-- 定义active.profile变量 -->
        <active.profile>dev</active.profile>
      </properties>
      <activation>
        <!-- 作为默认profile -->
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    <profile>
      <id>prod</id>
      <properties>
        <!-- 定义active.profile变量 -->
        <active.profile>prod</active.profile>
      </properties>
    </profile>
  </profiles>
</project

定义properties文件

文件结构如下:

1
2
3
4
5
6
/main
  /filters
    /db.dev.properties   #dev环境配置
    /db.prod.properties  #prod环境配置
  /resources
    /db.properties       #真正被程序使用的配置文件

/resources/db.properties文件的内容如下:

1
2
3
4
5
dataSource=${db.dataSource}
driverClassName=${db.driverClassName}
url=${db.url}
username=${db.username}
password=${db.password}

/filters/db.dev.properties文件内容如下:

1
2
3
4
5
db.dataSource=org.apache.commons.dbcp2.BasicDataSource
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/todolist-db?useUnicode=true&characterEncoding=utf8
db.username=root
db.password=123qwe

/filters/db.prod.properties内容类似,不再贴出。

在pom定义build行为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<build>
  <filters>
    <!-- 指定filter位置,注意路径里用到了第一步定义的profile属性 -->
    <filter>src/main/filters/db.${active.profile}.properties</filter>
  </filters>
  <resources>
    <!-- 定义resources位置,注意filtering要设为true -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

为不同环境构建

1
2
mvn clean package -Pprod  #为prod环境构建
mvn clean package         #没有指定profile默认为dev环境构建