項目開發中,工程須要經歷開發人員本地測試環境(dev),進入測試階段後有測試環境(test),測試無誤後須要將程序發佈到生產環境(production)下,而對於這三個不一樣的項目環境,應用程序要在該環境下運行,必須有不一樣的配置項,如開發和生產環境使用不一樣的數據庫地址,不一樣的線程池參數,所以須要對不一樣的項目環境進行不一樣的配置,爲了簡化和規範這些參數配置,須要對其進行統一規範管理。mysql
開發環境:該環境下的配置項隻影響開發人員本地代碼配置,在項目初期代碼本地編寫調試時啓用。sql
測試環境:該環境配置影響整個測試環境。數據庫
生產環境:程序最終發佈後所須要的參數配置,該環境下的配置項修改將直接影響最終用戶的使用和應用程序的運行。socket
系統的配置項統一放在src/main/filters/目錄下,三個環境的配置文件分別爲maven
filter-dev-env.properties測試
filter-test-env.propertiesui
filter-production-env.properties url
配置內容以下:spa
##################### DB config start #####################插件
user.jdbc.url=jdbc:mysql://172.0.0.1:3306/user?autoReconnect=true&rewriteBatchedStatements=true&socketTimeout=30000&connectTimeout=3000
user.jdbc.username=user
user.jdbc.password=user
項目工程統一使用maven的profile插件定義不一樣的項目構建環境(dev, test, production),經過filter插件爲不一樣環境下的配置項注入對應的參數值來實現動態配置目標。eg:
<profiles>
<!-- 開發集成環境-->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--默認啓用的是dev環境配置-->
</activation>
</profile>
<!-- 生產環境 -->
<profile>
<id>production</id>
<properties>
<env>production</env>
</properties>
</profile>
<!-- 測試環境 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
<properties>元素的內容則是以key-value的形式出現的鍵值對,如咱們定義了一個變量<env>,其值在不一樣的環境下(不一樣id)被賦予了不一樣的值(dev, production, test),要激活不一樣的環境打包,咱們能夠在命令行經過mvn package –P${profileId}來讓其運行,爲了開發便利,默認激活的是dev開發環境,即開發人員不須要經過命令行手動輸入-p參數也能運行dev環境的打包。
使用Maven來對項目資源進行變量替換。在資源過濾被激活的時候,Maven會掃描資源,尋找由${}包圍的Maven屬性的引用。一旦它找到這些引用,它就會使用合適的值去替換它們。能夠根據目標部署平臺使用不一樣的配置來參數化,這就很是有用。Filter的配置(在<build>元素下添加節點)以下:
<build>
<filters>
<filter>src/main/filters/filter-${env}-env.properties</filter>
</filters>
<!-- 配置須要被替換的資源文件地址 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
如在src/main/resources/目錄下的env.properties文件的內容以下:
##################### DB config start #####################
user.jdbc.url=${user.jdbc.url}
user.jdbc.username=${user.jdbc.username}
user.jdbc.password=${user.jdbc.password}