最近Support中x信托個金的WebATM案子,非常訝異,SCM checkout出來的source code不能compile,四個環境上跑的是哪個版本也不能確定,環境上的configuration也都不能完全確定哪個是正確的,再來改版時的patch是一個個class複製到deployment目錄下,XML或Properties也都是手動一個個修改....拜託,什麼年代了!?
能用程式做的就不要手動,寫個maven或ant的設定有這麼麻煩嗎?時間要花在更有義意的事情上,減少手動的工作,也減少人為的錯誤,多出來的時間回去陪家人不是更好些嗎....
XML及Properties的變動不外乎兩種方式解決
(1)Merge : 在範本檔案以${變數名}做為標記,然後再為不同環境寫不同的設定檔,為每個變數定出符合該環境的值,在Build的時候將範本與變數檔進行Merge,產生該環境專用的檔案,該檔案應與範本檔案同名
(2)Replace:為不同環境另存不同名的檔案,在Build的時以更名覆蓋的方式產生該環境專用的檔案
Merge的變數值有幾種設定方式
(1)放在系統變數中,範本檔以${env.變數名}取得該值,例如 export profilename=ABC;
(2)放在java 啟動參數數,以 -D變數名=變數值 帶入,範本檔則以${變數名}取得該值,例如 mvn -Dprofilename=ABC
(3)放在pom.xml中,以<properties><變數名>變數值</變數名></properties>設定,範本檔則以${變數名}取得該值,各profile可以自訂不同的properties
(4)放在其他檔案中,以一般java的properties檔案格式設定,如 變數名=變數值,在pom.xml中以<filters><filter>變數值設定檔</filter></filters>,範本檔則以${變數名}取得該值。
簡單看一下Maven的例子,下圖是一個非常簡單的maven project
其中
conf/prod/env.properties是prod環境Merge用的變數值設定檔案
setting.envname=prod
conf/template/system.properties則是上列所提Merge用的範本檔
profile.name=${profilename} #取自pom.xml中的設定
package.envname=${setting.envname} #取自env.properties
M2=${env.M2_HOME} #取自系統變數
src/main/resource下的兩個檔案則是為了展示利用antrun來執行Replace的操作,裡面的內容隨便設定,只要不一樣即可
再來列出pom.xml中的profiles設定
<profiles> <profile> <id>prod</id> <!-- 在Maven內自訂變數值 --> <properties> <profilename>PROD</profilename> </properties> <build> <!-- 將變數訂在特定檔案(env.properties) --> <filters> <filter>${basedir}/conf/prod/env.properties</filter> </filters> <resources> <!-- 系統原用的resource --> <resource> <directory>${basedir}/src/main/resources</directory> </resource> <!-- 因不同環境會有變動的設定檔範本 --> <resource> <directory>${basedir}/conf/template</directory> <filtering>true</filtering> </resource> </resources> <plugins> <!-- 利用Ant Run的Copy來取代檔案 --> <plugin> <artifactid>maven-antrun-plugin</artifactid> <executions> <execution> <phase>process-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <delete file="${project.build.outputDirectory}/antrun.replace"> </delete><copy tofile="${project.build.outputDirectory}/antrun.replace" file="${basedir}/src/main/resources/antrun.replace.prod"> </copy></tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </profiles>
再執行 mvn package -Pprod就可以看到結果了
沒有留言:
張貼留言