做爲一名程序員,在開發的過程當中,常常須要面對不一樣的運行環境(開發環境、測試環境、生產環境、內網環境、外網環境等等),在不一樣的環境中,相關的配置通常不同,好比數據源配置、日誌文件配置、以及一些軟件運行過程當中的基本配置。每次在不一樣環境部署程序時,都須要修改相應的配置文件,使之完成環境的配置。這麼作存在一個比較大的問題:每次修改配置很是麻煩,並且配置錯誤會產生不可預估的影響,好比,在發佈生產環境時用的開發環境的配置還好,但若是在開發環境下用生產環境的數據,將會形成生產數據的污染,致使生產環境崩潰。html
目前JAVA相關的項目基本都是使用Maven來進行構建。在maven中實現多環境的構建可移植性須要使用profile,經過不一樣的環境激活不一樣的profile來達到構建的可移植性。程序員
首先是profile配置,在pom.xml中添加以下profile的配置:apache
<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時默認是開發環境。app
同時每一個profile還定義了兩個屬性,其中profiles.active表示被激活的profile的配置文件的目錄。maven
針對不一樣的環境,咱們定義不一樣的配置文件,而這些配置文件都作爲資源文件放到maven工程的resources目錄下,即src/main/resources目錄下,且各個環境的配置分別放到相應的目錄下,而全部環境都公用的配置,直接放到src/main/resources目錄下便可。以下圖所示:
ide
如圖所示,開發環境、測試環境、生產環境的配置文件分別放到src/main/resources目錄下的dev、test、pro三個子目錄中,剩餘公共的配置文件放於resources目錄下。測試
在pom中的build節點下,配置資源文件的位置,以下所示:ui
<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。這樣就達到了不一樣環境加載不一樣配置的目的。url
全部須要的配置就完成了,經過在運行maven命令時指定不一樣的profile便可構建不一樣環境須要的war包或發佈到不一樣的環境了 。如:spa
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}
<properties> <profiles.active>test</profiles.active> <url>localhost</url> </properties>
maven在resources過程當中會替換爲localhost
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