[Maven]Maven中使用profile和filtering進行屬性替換
原文連結
http://www.360doc.com/content/15/0123/10/20466010_443036304.shtml
背景
構建專案時可能會遇到在測試(如單元測試)、開發、模擬、生產等不同環境下需要不同配製(properties、xml)或資源(jpg、png、mp3)的情況。比如常見的資料庫連線(即jdbc url)的值,在不同的環境下可能有如下幾種值:
- 測試環境:jdbc:mysql://localhost:3306/foobar_test
- 開發環境:jdbc:mysql://localhost:3306/foobar_dev
- 模擬環境:jdbc:mysql://192.168.1.11:3306/foobar
- 生產環境:jdbc:mysql://192.168.1.10:3306/foobar
或者同樣是生產環境,針對(產品)交付給A公司客戶的與交付給B公司客戶的需要不同配置或資源,比如產品介面中的公司名稱、公司LOGO等。
又或者針對不同的作業系統(如Windows,Linux)需要為某個配製設定不同的檔案路徑。
可見,在不同的軟體開發生命週期階段、不同的最終客戶(使用者環境)、不同的執行平臺都有可能需要不同配置或資源的情況。假如各個環境下的差別很小的話,我們可以在專案編譯之後手工修改或者寫個shell script自動修改,但如果需要修改的專案很多而且複雜的話,則應該使用Maven的Profile和Filtering功能來解決。(當然前題是你的專案必須是用Maven構建的啦,哈哈,還有測試階段所使用到的資原始檔實際上Maven預設已經劃分出來,所以並不需要本文所說的方法)
Filtering功能
Filtering是Maven Resources Plugin的一個功能,它會使用系統屬性或者專案屬性的值替換資原始檔(*.properties, *.xml)當中${…}符號的值。比如你係統屬性有一薦”user.name=foobar”,那麼資原始檔當中的${user.name}符號會在Maven編譯時會自動被替換為”foobar”。
舉個例子:
預設的專案資原始檔位於”src/main/resources”目錄,在該目錄下建立一個檔案”test.properties”,裡面寫上一行:
Hello ${user.name}
然後修改專案檔案(pom.xml)啟動filtering功能,如:
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
然後編譯專案:
$ mvn clean compile -Duser.name=foobar
檢視輸出檔案target/classess/test.properties的內容,可見原先的”Hello {user.name}”已經變成”Hello foobar”
我們也可以把filtering用到的變數寫在專案屬性段裡,比如:
<project>
...
<properties>
<user.name>foobar</user.name>
<user.email>[email protected]</user.email>
</properties>
...
</project>
如果屬性項比較多的話,最佳實踐是把他們抽離出來獨立一個屬性檔案,比如在你專案目錄(即pom.xml檔案所在的目錄)新建一個屬性檔案project.properties
user.name=foobar
user.email[email protected].cn
然後在build/filters/filter裡指明使用這個屬性檔案作為filtering屬性值的來源
<project>
...
<build>
...
<filters>
<filter>project.properties</filter>
</filters>
...
</build>
...
</project>
Profile功能
Profile的作用是允許你在專案檔案(pom.xml)裡定義若干個profile段,然後在編譯時選擇其中的一個用於覆蓋專案檔案原先的定義。接著上一個例子,如果我們需要為開發環境和生產環境定義不同的user.name屬性值,則我們在專案目錄裡建立兩個屬性檔案:
profile-development.properties,內容
user.name=foobar
profile-production.properties,內容
user.name=tom
然後在專案檔案(pom.xml)裡增加profile段,如下:
<project>
...
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>profile-development.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>production</id>
<build>
<filters>
<filter>profile-production.properties</filter>
</filters>
</build>
</profile>
</profiles>
...
</project>
在編譯專案時,可以使用-P引數指定需要使用的profile的id,比如下面命令將會使用development profile:
$mvn clean compile -Pdevelopment
如果想使用production profile則執行如下命令:
$mvn clean compile -Pproduction
假如不指定-P引數的話,則會使用activeByDefault=true的一項(即development)。
至此,通過filtering和profile功能實現了為開發環境和生產環境使用不同配置值的目的。當然profile還可以允許你新增更多的定義,比如為某一個profile新增不同的資原始檔。在一些大中型專案裡,不同的環境可能僅僅修改配置值並不足夠,可能還需要某個配置檔案整個替換,那麼就應該在profiles/profile/build/resources段裡指定了。詳細的可以參閱附錄連結。