profile可讓咱們定義一系列的配置信息,而後指定其激活條件。這樣咱們就能夠定義多個profile,而後每一個profile對應不一樣的激活條件和配置信息,從而達到不一樣環境使用不一樣配置信息的效果。好比說,咱們能夠經過profile定義在jdk1.5以上使用一套配置信息,在jdk1.5如下使用另一套配置信息;或者有時候咱們能夠經過操做系統的不一樣來使用不一樣的配置信息,好比windows下是一套信息,linux下又是另一套信息,等等。具體的激活條件有哪些我在後文會講到。linux
對於使用Maven3,咱們能夠有多個地方定義profile。定義的地方不一樣,它的做用範圍也不一樣。windows
(1) 針對於特定項目的profile配置咱們能夠定義在該項目的pom.xml中。測試
(2) 針對於特定用戶的profile配置,咱們能夠在用戶的settings.xml文件中定義profile。該文件在用戶家目錄下的「.m2」目錄下。ui
(3) 全局的profile配置。全局的profile是定義在Maven安裝目錄下的「conf/settings.xml」文件中的。spa
profile中可以定義的配置信息跟profile所處的位置是相關的。如下就分兩種狀況來討論,一種是定義在settings.xml中,另外一種是定義在pom.xml中。操作系統
當profile定義在settings.xml中時意味着該profile是全局的,它會對全部項目或者某一用戶的全部項目都產生做用。由於它是全局的,因此在settings.xml中只能定義一些相對而言範圍寬泛一點的配置信息,好比遠程倉庫等。而一些比較細緻一點的須要根據項目的不一樣來定義的就須要定義在項目的pom.xml中。具體而言,可以定義在settings.xml中的信息有<repositories>、<pluginRepositories>和<properties>。定義在<properties>裏面的鍵值對能夠在pom.xml中使用。xml
定義在pom.xml中的profile能夠定義更多的信息。主要有如下這些:blog
l <repositories>ci
l <pluginRepositories>get
l <dependencies>
l <plugins>
l <properties>
l <dependencyManagement>
l <distributionManagement>
l 還有build元素下面的子元素,主要包括:
<defaultGoal>
<resources>
<testResources>
<finalName>
Maven給咱們提供了多種不一樣的profile激活方式。好比咱們可使用-P參數顯示的激活一個profile,也能夠根據環境條件的設置讓它自動激活等。下面將對它們一一進行介紹:
先看下面一個配置
Xml代碼
咱們能夠在profile中的activation元素中指定激活條件,當沒有指定條件,而後指定activeByDefault爲true的時候就表示當沒有指定其餘profile爲激活狀態時,該profile就默認會被激活。因此當咱們調用mvn package的時候上面的profileTest1將會被激活,可是當咱們使用mvn package –P profileTest2的時候將激活profileTest2,而這個時候profileTest1將不會被激活。
咱們能夠在settings.xml中使用activeProfiles來指定須要激活的profile,這種方式激活的profile將全部狀況下都處於激活狀態。好比如今咱們定義了以下兩個profile
Xml代碼
這裏的profile能夠是定義在settings.xml中的,也能夠是定義在pom.xml中的。這個時候若是咱們須要指定profileTest1爲激活狀態,那麼咱們就能夠在settings.xml中定義activeProfiles,具體定義以下:
Xml代碼
考慮這樣一種狀況,咱們在activeProfiles下同時定義了多個須要激活的profile。這裏還拿上面的profile定義來舉例,咱們定義了同時激活profileTest1和profileTest2。
Xml代碼
從profileTest1和profileTest2咱們能夠看出它們共同定義了屬性hello。那麼這個時候我在pom.xml中使用屬性hello的時候,它到底取的哪一個值呢?是根據activeProfile定義的順序,後面的覆蓋前面的嗎?根據個人測試,答案是非也,它是根據profile定義的前後順序來進行覆蓋取值的,而後後面定義的會覆蓋前面定義的。
假設咱們如今有以下定義的profiles
Xml代碼
那麼當咱們在進行Maven操做時就可使用-P參數顯示的指定當前激活的是哪個profile了。好比咱們須要在對項目進行打包的時候使用id爲profileTest1的profile,咱們就能夠這樣作:
Cmd代碼
當咱們使用activeByDefault或settings.xml中定義了處於激活的profile,可是當咱們在進行某些操做的時候又不想它處於激活狀態,這個時候咱們能夠這樣作:
Cmd代碼
這裏假設profileTest1是在settings.xml中使用activeProfile標記的處於激活狀態的profile,那麼當咱們使用「-P !profile」的時候就表示在當前操做中該profile將不處於激活狀態。
profile一個很是重要的特性就是它能夠根據不一樣的環境來激活,好比說根據操做系統的不一樣激活不一樣的profile,也能夠根據jdk版本的不一樣激活不一樣的profile,等等。
Xml代碼
上面狀況表示在jdk爲1.5版本系列的時候激活profileTest1。
Xml代碼
上面的狀況表示在jdk爲1.四、1.5和1.6的時候激活profileTest1。
Xml代碼
上面的狀況就是根據操做系統的類型來激活profileTest1。
Xml代碼
上面的profileTest1將在提供了系統屬性hello,而且其值爲world的時候激活。下面的作法能夠激活profileTest1。
Cmd代碼
當是下面的這種定義形式時,profileTest1將在指定了系統屬性hello,且其值爲任意值的時候被激活。
Xml代碼
Xml代碼
上面的定義表示當存在target文件時激活profileTest1。
Xml代碼
上面的定義表示當不存在target文件時激活profileTest1。
咱們能夠同時定義多個profile,那麼在創建項目的過程當中,到底激活的是哪個profile呢?Maven爲咱們提供了一個指令能夠查看當前處於激活狀態的profile都有哪些,這個指定就是mvn help:active-profiles。
如今假設咱們的settings.xml文件中有以下profile的定義:
Xml代碼
這個時候咱們能夠看到,咱們已經定義了profileTest1始終爲激活狀態,這個時候咱們使用mvn help:active-profiles查看處於激活狀態的profile時,就會打印出以下內容: