1. 程式人生 > >[Maven]Maven中使用profile和filtering進行屬性替換

[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功能

FilteringMaven 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段裡指定了。詳細的可以參閱附錄連結。