1. 程式人生 > >Maven學習總結(49)——Maven Profile詳解

Maven學習總結(49)——Maven Profile詳解

前言

Profile能讓你為一個特殊的環境自定義一個特殊的構建;profile使得不同環境間構建的可移植性成為可能。Maven中的profile是一組可選的配置,可以用來設定或者覆蓋配置預設值。有了profile,你就可以為不同的環境定製構建。profile可以在pom.xml中配置,並給定一個id。然後你就可以在執行Maven的時候使用的命令列標記告訴Maven執行特定profile中的目標。一個Profiles下面允許出現的元素:

<project>
    <profiles>
        <profile>
            <build>
                <defaultGoal>...</defaultGoal>
                <finalName>...</finalName>
                <resources>...</resources>
                <testResources>...</testResources>
                <plugins>...</plugins>
            </build>
            <reporting>...</reporting>
            <modules>...</modules>
            <dependencies>...</dependencies>
            <dependencyManagement>...</dependencyManagement>
            <distributionManagement>...</distributionManagement>
            <repositories>...</repositories>
            <pluginRepositories>...</pluginRepositories>
            <properties>...</properties>
        </profile>
    </profiles>
</project> 

一個Profile可以覆蓋專案構件的最終名稱,專案依賴,外掛配置以影響構建行為,Profile還可以覆蓋分發配置。maven提供了一種針對不同環境引數“啟用”一個profile的方式,這就叫做profile啟用。

一、profile簡介

profile可以讓我們定義一系列的配置資訊,然後指定其啟用條件。這樣我們就可以定義多個profile,然後每個profile對應不同的啟用條件和配置資訊,從而達到不同環境使用不同配置資訊的效果。比如說,我們可以通過profile定義在jdk1.5以上使用一套配置資訊,在jdk1.5以下使用另外一套配置資訊;或者有時候我們可以通過作業系統的不同來使用不同的配置資訊,比如windows下是一套資訊,linux下又是另外一套資訊,等等。

二、profile的定義位置

我們可以有多個地方定義profile。定義的地方不同,它的作用範圍也不同。

  • 針對於特定專案的profile配置我們可以定義在該專案的pom.xml中。
  • 針對於特定使用者的profile配置,我們可以在使用者的settings.xml檔案中定義profile。該檔案在使用者家目錄下的“.m2”目錄下。
  • 全域性的profile配置。全域性的profile是定義在Maven安裝目錄下的“conf/settings.xml”檔案中的。

三、profile中能定義的資訊

profile中能夠定義的配置資訊跟profile所處的位置是相關的。以下就分兩種情況來討論,一種是定義在settings.xml中,另一種是定義在pom.xml中。3.1、profile定義在settings.xml中

當profile定義在settings.xml中時意味著該profile是全域性的,它會對所有專案或者某一使用者的所有專案都產生作用。因為它是全域性的,所以在settings.xml中只能定義一些相對而言範圍寬泛一點的配置資訊,比如遠端倉庫等。而一些比較細緻一點的需要根據專案的不同來定義的就需要定義在專案的pom.xml中。具體而言,能夠定義在settings.xml中的資訊有<repositories>、<pluginRepositories>和<properties>。定義在<properties>裡面的鍵值對可以在pom.xml中使用。3.2、profile定義在pom.xml中

定義在pom.xml中的profile可以定義更多的資訊。主要有以下這些:

<repositories>
    <pluginRepositories>
    <dependencies>
    <plugins>
    <properties>
    <dependencyManagement>
    <distributionManagement>
    ##還有build元素下面的子元素,主要包括:
    <defaultGoal>
    <resources>
    <testResources>
    <finalName>

四、profile的啟用方式

Maven給我們提供了多種不同的profile啟用方式。比如我們可以使用-P引數顯示的啟用一個profile,也可以根據環境條件的設定讓它自動啟用等。下面將對它們一一進行介紹:4.1、使用activeByDefault設定啟用

<profiles> 
    <profile> 
        <id>profileTest1</id> 
        <properties> 
            <hello>world</hello> 
        </properties> 
        <activation> 
            <activeByDefault>true</activeByDefault> 
        </activation> 
    </profile> 
    <profile> 
        <id>profileTest2</id> 
        <properties> 
            <hello>andy</hello> 
        </properties> 
    </profile> 
</profiles> 

我們可以在profile中的activation元素中指定啟用條件,當沒有指定條件,然後指定activeByDefault為true的時候就表示當沒有指定其他profile為啟用狀態時,該profile就預設會被啟用。所以當我們呼叫mvn package的時候上面的profileTest1將會被啟用,但是當我們使用mvn package –P profileTest2的時候將啟用profileTest2,而這個時候profileTest1將不會被啟用。4.2、在settings.xml中使用activeProfiles指定處於啟用狀態的profile

我們可以在settings.xml中使用activeProfiles來指定需要啟用的profile,這種方式啟用的profile將所有情況下都處於啟用狀態。比如現在我們定義瞭如下兩個profile。

<profiles> 
    <profile> 
        <id>profileTest1</id> 
        <properties> 
            <hello>world</hello> 
        </properties> 
    </profile> 
    <profile> 
        <id>profileTest2</id> 
        <properties> 
            <hello>andy</hello> 
        </properties> 
    </profile> 
</profiles> 

這裡的profile可以是定義在settings.xml中的,也可以是定義在pom.xml中的。這個時候如果我們需要指定profileTest1為啟用狀態,那麼我們就可以在settings.xml中定義activeProfiles,具體定義如下:

<activeProfiles> 
    <activeProfile>profileTest1</activeProfile> 
</activeProfiles> 

考慮這樣一種情況,我們在activeProfiles下同時定義了多個需要啟用的profile。這裡還拿上面的profile定義來舉例,我們定義了同時啟用profileTest1和profileTest2。

<activeProfiles> 
    <activeProfile>profileTest1</activeProfile> 
    <activeProfile>profileTest2</activeProfile> 
</activeProfiles> 

從profileTest1和profileTest2我們可以看出它們共同定義了屬性hello。那麼這個時候我在pom.xml中使用屬性hello的時候,它到底取的哪個值呢?是根據activeProfile定義的順序,後面的覆蓋前面的嗎?根據我的測試,答案是非也,它是根據profile定義的先後順序來進行覆蓋取值的,然後後面定義的會覆蓋前面定義的。4.3、使用-P引數顯示的啟用一個profile

我們在進行Maven操作時就可以使用-P引數顯示的指定當前啟用的是哪一個profile了。比如我們需要在對專案進行打包的時候使用id為profileTest1的profile,我們就可以這樣做:

mvn package –P profileTest1 

當我們使用activeByDefault或settings.xml中定義了處於啟用的profile,但是當我們在進行某些操作的時候又不想它處於啟用狀態,這個時候我們可以這樣做:

mvn package –P !profileTest1 

這裡假設profileTest1是在settings.xml中使用activeProfile標記的處於啟用狀態的profile,那麼當我們使用“-P !profile”的時候就表示在當前操作中該profile將不處於啟用狀態。4.4、根據環境來啟用profile

profile一個非常重要的特性就是它可以根據不同的環境來啟用,比如說根據作業系統的不同啟用不同的profile,也可以根據jdk版本的不同啟用不同的profile,等等。

<profiles> 
    <profile> 
        <id>profileTest1</id> 
        <jdk>1.5</jdk> 
    </profile> 
<profiles> 

五、檢視當前處於啟用狀態的profile

我們可以同時定義多個profile,那麼在建立專案的過程中,到底啟用的是哪一個profile呢?Maven為我們提供了一個指令可以檢視當前處於啟用狀態的profile都有哪些,這個指定就是mvn help:active-profiles。