一般的軟件項目,在開發、測試及生產等環境下配置文件中參數是不同的。傳統的做法是在項目部署的時候,手動修改或者替換這個配置文件。這樣太麻煩了,我們可以用Maven的profile來解決這個問題。只要在打包時加個參數就可以實現想打那個環境的配置文件就打包那個環境的配置文件,提高了效率。
下面介紹下具體的做法
一、多環境配置文件的放置
將不同環境下的配置文件按照文件夾來划分,但需要保證配置文件的文件名在不同環境下必須一致
- development:開發環境
- testing:測試環境
- production:生產環境
配置文件分文件夾后的效果如下圖

二、pom文件的配置
(1)配置profile
在pom文件中配置不同的profile。profile里面id標簽為這個profile的名字,properties標簽的內容為這個profile里面的參數。
我們配置profile的參數為: profiles.active=對應環境文件夾名字
這樣在打包資源文件時,通過激活不同的profile來拿取profiles.active的值所對應的文件夾進行打包。
代碼如下:
<profiles>
<profile>
<!-- 開發環境 -->
<id>development</id>
<properties>
<profiles.active>development</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 測試環境 -->
<id>testing</id>
<properties>
<profiles.active>testing</profiles.active>
</properties>
</profile>
<profile>
<!-- 生產環境 -->
<id>production</id>
<properties>
<profiles.active>production</profiles.active>
</properties>
</profile>
</profiles>
x
1
<profiles>
2
<profile>
3
<!-- 開發環境 -->
4
<id>development</id>
5
<properties>
6
<profiles.active>development</profiles.active>
7
</properties>
8
<activation>
9
<activeByDefault>true</activeByDefault>
10
</activation>
11
</profile>
12
<profile>
13
<!-- 測試環境 -->
14
<id>testing</id>
15
<properties>
16
<profiles.active>testing</profiles.active>
17
</properties>
18
</profile>
19
<profile>
20
<!-- 生產環境 -->
21
<id>production</id>
22
<properties>
23
<profiles.active>production</profiles.active>
24
</properties>
25
</profile>
26
</profiles>
通過
<activeByDefault>true</activeByDefault>
設置默認激活的profile
(2)配置maven資源文件打包規則
打包資源文件時,需要通過profile里面的
profiles.active的值來切換不同環境的資源
文件。具體的配置見下面代碼
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 這個filter必須要設為true, 把所有文件都過濾掉,然后下面再手動include,一個一個文件夾自己添加 -->
<filtering>true</filtering>
<includes>
<include>spring/*</include>
</includes>
</resource>
<resource>
<!-- 這里會直接把${profiles.active}對應文件夾下的內容打包到classpath下 -->
<directory>src/main/resources/${profiles.active}</directory>
</resource>
</resources>
14
1
<resources>
2
<resource>
3
<directory>src/main/resources</directory>
4
<!-- 這個filter必須要設為true, 把所有文件都過濾掉,然后下面再手動include,一個一個文件夾自己添加 -->
5
<filtering>true</filtering>
6
<includes>
7
<include>spring/*</include>
8
</includes>
9
</resource>
10
<resource>
11
<!-- 這里會直接把${profiles.active}對應文件夾下的內容打包到classpath下 -->
12
<directory>src/main/resources/${profiles.active}</directory>
13
</resource>
14
</resources>
關於maven的resource可以參考這篇文章:
https://blog.csdn.net/feicongcong/article/details/78833618
特別關注下
<includes>
和
<directory>
的作用
這里由於用了
<directory>src/main/resources/${profiles.active}</directory>
,它是把
${profiles.active}
對應文件夾下的內容打包到
classpath
下面了,所以讀取
${profile.active}
文件夾下的propertis文件的路徑為
classpath:xxx.properties
三、如何在Spring配置文件中讀取這些不同環境下的propertis文件
其實在上面已經說了,按照我這個配置來讀取的話,這些propertis文件都在classpath下面。參考代碼如下
<bean id="propertyConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:redis-config.properties</value>
<value>classpath:dubbo-client.properties</value>
<value>classpath:rabbitmq-config.properties</value>
</list>
</property>
</bean>
1
<bean id="propertyConfig"
2
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
3
<property name="locations">
4
<list>
5
<value>classpath:redis-config.properties</value>
6
<value>classpath:dubbo-client.properties</value>
7
<value>classpath:rabbitmq-config.properties</value>
8
</list>
9
</property>
10
</bean>
四、如何打包
mvn package –P 這里填你的profile的id值
特別注意:P是大寫的