代碼裏的resource信息有不少,代碼裏寫死某一個環境的配置的話,有如下若干問題。spring
1. dev,不一樣的beta上,使用的resource信息不一樣。sql
2. 代碼沒有發佈到對應的環境上,須要去機器上須要手動修改。不鎖住配置文件,則每次發佈都須要手動修改;若鎖住配置文件,則代碼更新了配置文件,則機器上仍是老的配置文件。把測試的環境寫到代碼裏,容易引發配置不穩定,上線前忘了改過來可能形成問題。數據庫
3. 測試中有時日誌中沒有打出來是使用的是哪一個環境配置,發現環境不對時,查起來費時又費勁。dom
4. 環境交付其餘團隊使用時,出問題還須要支出人力配合定位問題。maven
爲了解決以上問題,咱們能夠作如下的事情。測試
1、profileui
當resource配置信息內容根據環境種類的不一樣而不一樣時,如dev和beta使用不一樣的sql數據庫鏈接配置等,使用profile來針對每一個環境配置一套resource。pmo中加入:日誌
<profiles> <!-- 打包開發環境 --> <profile> <id>dev</id> <activation> <property> <name>hello.dev</name> <value>dev</value> </property> </activation> <build> <resources> <resource> <directory>${profiles.dir}/dev</directory> </resource> </resources> </build> </profile> <!-- 打包beta環境 --> <profile> <id>hello.beta</id> <activation> <property> <name>hello.beta</name> <value>beta</value> </property> </activation> <build> <resources> <resource> <directory>${profiles.dir}/beta</directory> </resource> </resources> </build> </profile> </profiles>
指定dev和beta分別使用的resource目錄。咱們在profiles.dir裏準備好對應的resource配置便可。發佈時,使用maven命令激活相應的環境便可:mvn -P beta 即便用了beta的profile。xml
2、filterblog
有時,同一種環境,只是域名不一樣,可使用filter來進行變量替換。如,環境A1上,域名應是xxxA1.beta.com; 環境A2上,域名應是xxxA2.beta.com。pmo上配置:
<profile> <id>beta</id> <activation> <property> <name>hello.beta</name> <value>beta</value> </property> </activation> <build> <filters> <filter>src/main/filters/beta.properties</filter> </filters> <resources> <resource> <directory>${profiles.dir}/beta</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> <include>**/*.config</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> </profile>
配置裏說,${profiles.dir}/beta裏符合條件的文件,須要被filter裏配置的文件裏的參數進行替換。filter配置src/main/filters/beta.properties裏的文件怎麼寫呢?
all.use.A.domain=xxxA1.beta.com all.use.B.domain=xxxB1.beta.com
看到filter文件裏,配置了A服務對應的域名是xxxA1.beta.com。就是說,resource文件裏,遇到${all.use.A.domain}這個變量時,即替換爲xxxA1.beta.com。
以上是默認的配置,在編譯的時候,使用命令:mvn -Pbeta clean package -Dall.use.A.domain=xxxA2.beta.com,則在編譯的時候,會將xxxA2.beta.com這個內容替換到resource裏${all.use.A.domain}的變量處。
注意與profile下配置文件裏的變量的區別。在filter文件裏的變量,在編譯時,會替換掉原文件中的值。而在profile配置文件中定義的變量,不會替換代碼裏的變量佔用號,發佈機器上,還是變量符號。
好比,resources文件spring-dubbo-consumer.xml裏,配置文件內容爲:
<dubbo:registry id="ordercenter_core" protocol="zookeeper" address="${dubbo.zk}" group="${core_dubbo_group}"></dubbo:registry>
其中,${dubbo.zk}這個變量內容定義在profiles下的文件中,內容爲dubbo.zk=l-zk.beta.com:8888。代碼發佈到測試上後,查看spring-dubbo-consumer.xml,內容不變。變量替換是在服務執行時完成的。