在實際項目開發中,咱們須要根據不一樣的使用場景,構建不一樣的程序包。當使用Maven編譯時,咱們能夠經過Maven的profile標籤來配置編譯選項,從而達到生成不一樣構建產物的目的。例如,在開發環境下,咱們有一套適用於本機的調試配置;而在生產環境下,又須要關閉調試環境時的大量調試日誌,或變動日誌保存路徑等。這些需求均可以經過Maven的Profile標籤配置來解決。html
profile可讓咱們定義一系列的配置信息,而後指定其激活條件。由此,咱們就能夠定義多個profile,而後每一個profile對應不一樣的激活條件和配置信息,從而達到不一樣環境使用不一樣配置信息的效果。好比說,咱們能夠經過profile定義在jdk1.5以上使用一套配置信息,在jdk1.5如下使用另一套配置信息;或者有時候咱們能夠經過操做系統的不一樣來使用不一樣的配置信息,好比windows下是一套信息,linux下又是另一套信息,等等。linux
咱們有多個可選位置來定義profile。定義的地方不一樣,它的做用範圍也不一樣。spring
profile中可以定義的配置信息跟profile所處的位置是相關的。如下就分兩種狀況來討論,一種是定義在settings.xml中,另外一種是定義在pom.xml中。apache
當profile定義在settings.xml中時意味着該profile是全局的,它會對全部項目或者某一用戶的全部項目都產生做用。也正由於它是全局的,因此在settings.xml中只能定義一些相對而言範圍寬泛一點的配置信息,好比遠程倉庫等。而一些比較細緻一點的須要根據項目的不一樣來定義的就須要定義在項目的pom.xml中。具體而言,可以定義在settings.xml中的信息有:windows
定義在pom.xml中的profile能夠定義更多的信息。主要有如下這些:bash
還有build元素下面的子元素,主要包括:maven
Maven給咱們提供了多種不一樣的profile激活方式。好比咱們可使用-P參數在編譯時,顯示的激活一個profile,也能夠根據環境條件的設置讓它自動激活等。ide
<profiles>
<profile>
<id>dev</id>
<properties>
<properties.active>dev</properties.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>release</id>
<properties>
<properties.active>release</properties.active>
</properties>
</profile>
</profiles>
複製代碼
咱們能夠在profile下的activation標籤中,經過activeByDefault標籤配置激活狀態,當沒有在編譯命令中配置任何激活條件時,activeByDefault標籤在哪一個profile下配置爲true的時候,就表示該profile在編譯時默認會被激活。ui
咱們能夠在settings.xml中使用activeProfiles來指定須要激活的profile,這種方式激活的profile將全部狀況下都處於激活狀態。好比如今咱們定義了以下兩個profile:spa
<profiles>
<profile>
<id>dev</id>
<properties>
<properties.active>dev</properties.active>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<properties.active>release</properties.active>
</properties>
</profile>
</profiles>
複製代碼
這裏的profile能夠是定義在settings.xml中的,也能夠是定義在pom.xml中的。當這時須要指定dev爲激活狀態,那麼咱們就能夠在settings.xml中定義activeProfiles,以下:
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
複製代碼
考慮這樣一種狀況,咱們在activeProfiles下同時定義了多個須要激活的profile。這裏還拿上面的profile定義來舉例,咱們定義了同時激活dev和release。
<activeProfiles>
<activeProfile>dev</activeProfile>
<activeProfile>release</activeProfile>
</activeProfiles>
複製代碼
那麼這個時候我在pom.xml中使用屬性properties.active的時候,它是根據profile定義的前後順序來進行覆蓋取值的,即後面定義的會覆蓋前面定義的。
咱們在進行Maven操做時可使用-P參數顯示的指定當前激活的是哪個profile。好比咱們須要在對項目進行打包的時候使用id爲dev的profile,咱們就能夠這樣作:
mvn package -P dev
複製代碼
假如咱們使用activeByDefault或settings.xml中定義了處於激活的profile,可是當咱們在進行某些操做的時候又不想它處於激活狀態,這個時候咱們能夠這樣作:
mvn package –P !dev
複製代碼
這裏假設dev是在settings.xml中使用activeProfile標記的處於激活狀態的profile,那麼當咱們使用「-P !dev」的時候就表示在當前操做中該profile將不處於激活狀態。
profile一個很是重要的特性就是它能夠根據不一樣的編譯環境來激活,好比說根據操做系統的不一樣激活不一樣的profile,也能夠根據jdk版本的不一樣激活不一樣的profile,等等。
<profiles>
<profile>
<id>profileTest1</id>
<jdk>1.5</jdk>
</profile>
<profiles>
複製代碼
咱們以配置log4j2爲例來講一說開發環境和生產環境的不一樣設置。
這兩個配置文件的主要區別在於,其中的日誌保存路徑是不一樣的。(此處只是爲了演示區別,隨意對路徑進行了配置,可本身配置所需路徑) 調試用的log4j2-spring.xml:
正式環境下的log4j2-spring.xml: 並分別將剛纔的兩個文件放置到對應的目錄中。在項目的pom.xml文件中,在其根節點project下,增長profiles標籤:
其中:
在項目的pom.xml文件中,在其build節點下,增長resource標籤:
其中:
經過執行下面的命令進行編譯:
mvn package -P dev
複製代碼
激活了dev編譯條件。編譯生成war或jar文件後,能夠解壓構建包,確認配置文件被打包到構建包的根目錄下。
profile的配置是很是靈活的,經過在profile標籤下自定義一些鍵值對,並在其餘配置文件中使用這些鍵值,就能夠在編譯時指定激活的配置。本文舉例瞭如何從文件的維度,來進行配置文件的配置。相對於單一的配置鍵值對的使用來講,其實是列舉了一個包含小技巧的例子,而這個小例子也是平常咱們常常會遇到的。但願你們可以在實際運用中採用,有任何問題和錯誤之處,歡迎評論指正,不勝感激。
附Maven-profiles說明連接: Maven – Introduction to build profiles
小銘出品,必屬精品。