通過maven profile實現多套環境配置
maven profile的使用
作為一名程式設計師,在開發的過程中,經常需要面對不同的執行環境(開發環境、測試環境、生產環境、內網環境、外網環境等等),在不同的環境中,相關的配置一般不一樣,比如資料來源配置、日誌檔案配置、以及一些軟體執行過程中的基本配置。每次在不同環境部署程式時,都需要修改相應的配置檔案,使之完成環境的配置。這麼做存在一個比較大的問題:每次修改配置非常麻煩,而且配置錯誤會產生不可預估的影響,比如,在釋出生產環境時用的開發環境的配置還好,但如果在開發環境下用生產環境的資料,將會造成生產資料的汙染,導致生產環境崩潰。
目前JAVA相關的專案基本都是使用Maven來進行構建。在maven中實現多環境的構建可移植性需要使用profile,通過不同的環境啟用不同的profile來達到構建的可移植性。
一、POM中profile的配置
首先是profile配置,在pom.xml中新增如下profile的配置:
-
<profiles>
-
<profile>
-
<!-- 本地開發環境 -->
-
<id>dev</id>
-
<properties>
-
<profiles.active>dev</profiles.active>
-
</properties>
-
<activation>
-
<activeByDefault>true</activeByDefault>
-
</activation>
-
</profile>
-
<profile>
-
<!-- 測試環境 -->
-
<id>test</id>
-
<properties>
-
<profiles.active>test</profiles.active>
-
</properties>
-
</profile>
-
<profile>
-
<!-- 生產環境 -->
-
<id>pro</id>
-
<properties>
-
<profiles.active>pro</profiles.active>
-
</properties>
-
</profile>
-
</profiles>
這裡定義了三個環境,dev(開發環境)、test(測試環境)、pro(生產環境),其中開發環境是預設啟用的(activeByDefault為true),這樣如果在不指定profile時預設是開發環境。
同時每個profile還定義了兩個屬性,其中profiles.active表示被啟用的profile的配置檔案的目錄。
二、工程目錄
針對不同的環境,我們定義不同的配置檔案,而這些配置檔案都做為資原始檔放到maven工程的resources目錄下,即src/main/resources目錄下,且各個環境的配置分別放到相應的目錄下,而所有環境都公用的配置,直接放到src/main/resources目錄下即可。如下圖所示:
如圖所示,開發環境、測試環境、生產環境的配置檔案分別放到src/main/resources目錄下的dev、test、pro三個子目錄中,剩餘公共的配置檔案放於resources目錄下。
三、POM檔案中build配置
在pom中的build節點下,配置資原始檔的位置,如下所示:
-
<build>
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<!-- 資源根目錄排除各環境的配置,防止在生成目錄中多餘其它目錄 -->
-
<excludes>
-
<exclude>test/*</exclude>
-
<exclude>pro/*</exclude>
-
<exclude>dev/*</exclude>
-
</excludes>
-
</resource>
-
<resource>
-
<directory>src/main/resources/${profiles.active}</directory>
-
</resource>
-
</resources>
-
</build>
首先第一個資原始檔位置src/main/resources需要排隊提各個環境的配置檔案,各個環境的配置我們在第二個節點中通過前面在profile中配置的profiles.active屬性來指定。即src/main/resources/${profiles.active}。這樣在啟用指定的profile時,會載入指定目錄下的配置檔案,如當前啟用的是pro profile,那麼這個資源目錄就是src/main/resources/pro。這樣就達到了不同環境載入不同配置的目的。
五、專案編譯生成
所有需要的配置就完成了,通過在執行maven命令時指定不同的profile即可構建不同環境需要的war包或釋出到不同的環境了 。如:
mvn clean package -Ppro即構建出生產環境需要的war包
由於預設的profile是dev,所以如果我們不指定profile,那麼載入就是開發環境dev下的配置檔案了。即我們在本地開發測試時,不用關心profile的問題。
其它方法
在resource節點中可以增加如下節點
-
<resource>
-
<directory>src/main/resources</directory>
-
<!-- 資源根目錄排除各環境的配置,使用單獨的資源目錄來指定 -->
-
<excludes>
-
<exclude>test/*</exclude>
-
<exclude>pro/*</exclude>
-
<exclude>dev/*</exclude>
-
</excludes>
-
<filtering>true</filtering>
-
</resource>
在某個resource中如果設定filtering為true,將會根據輸入引數動態修改相關內容。
配置檔案app.config中為
url=${url}
方式一,使用profile的properties
-
<properties>
-
<profiles.active>test</profiles.active>
-
<url>localhost</url>
-
</properties>
maven在resources過程中會替換為localhost
方式二,使用命令引數-D
mvn clean package -Durl=localhost
同樣的效果,都會copy資原始檔的時候設定這個url的引數
參考連結
http://maven.apache.org/guides/introduction/introduction-to-profiles.html
http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/
http://blog.csdn.net/mhmyqn/article/details/24501281