轉載自:https://www.cnblogs.com/wxgblogs/p/6696229.html
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中。
profile定義在settings.xml中
當profile定義在settings.xml中時意味着該profile是全局的,它會對所有項目或者某一用戶的所有項目都產生作用。因為它是全局的,所以在settings.xml中只能定義一些相對而言范圍寬泛一點的配置信息,比如遠程倉庫等。而一些比較細致一點的需要根據項目的不同來定義的就需要定義在項目的pom.xml中。具體而言,能夠定義在settings.xml中的信息有<repositories>、<pluginRepositories>和<properties>。定義在<properties>里面的鍵值對可以在pom.xml中使用。
profile定義在pom.xml中
定義在pom.xml中的profile可以定義更多的信息。主要有以下這些:
<repositories> <pluginRepositories> <dependencies> <plugins> <properties> <dependencyManagement> <distributionManagement> 還有build元素下面的子元素,主要包括: <defaultGoal> <resources> <testResources> <finalName>
profile的激活方式
Maven給我們提供了多種不同的profile激活方式。比如我們可以使用-P參數顯示的激活一個profile,也可以根據環境條件的設置讓它自動激活等。下面將對它們一一進行介紹:
使用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將不會被激活。
在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定義的先后順序來進行覆蓋取值的,然后后面定義的會覆蓋前面定義的。
使用-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將不處於激活狀態。
根據環境來激活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