Maven根據pom文件中的Profile標籤動態配置編譯選項

概述

  在實際項目開發中,咱們須要根據不一樣的使用場景,構建不一樣的程序包。當使用Maven編譯時,咱們能夠經過Maven的profile標籤來配置編譯選項,從而達到生成不一樣構建產物的目的。例如,在開發環境下,咱們有一套適用於本機的調試配置;而在生產環境下,又須要關閉調試環境時的大量調試日誌,或變動日誌保存路徑等。這些需求均可以經過Maven的Profile標籤配置來解決。html

  profile可讓咱們定義一系列的配置信息,而後指定其激活條件。由此,咱們就能夠定義多個profile,而後每一個profile對應不一樣的激活條件和配置信息,從而達到不一樣環境使用不一樣配置信息的效果。好比說,咱們能夠經過profile定義在jdk1.5以上使用一套配置信息,在jdk1.5如下使用另一套配置信息;或者有時候咱們能夠經過操做系統的不一樣來使用不一樣的配置信息,好比windows下是一套信息,linux下又是另一套信息,等等。linux

profile屬性的定義位置

  咱們有多個可選位置來定義profile。定義的地方不一樣,它的做用範圍也不一樣。spring

  • 針對於特定項目的profile配置咱們能夠定義在該項目的pom.xml中。
  • 針對於特定用戶的profile配置,咱們能夠在用戶的settings.xml文件中定義profile。該文件在用戶家目錄下的「.m2」目錄下。
  • 全局的profile配置。全局的profile是定義在Maven安裝目錄下的「conf/settings.xml」文件中的。

profile中能定義的信息

  profile中可以定義的配置信息跟profile所處的位置是相關的。如下就分兩種狀況來討論,一種是定義在settings.xml中,另外一種是定義在pom.xml中。apache

profile定義在settings.xml中

  當profile定義在settings.xml中時意味着該profile是全局的,它會對全部項目或者某一用戶的全部項目都產生做用。也正由於它是全局的,因此在settings.xml中只能定義一些相對而言範圍寬泛一點的配置信息,好比遠程倉庫等。而一些比較細緻一點的須要根據項目的不一樣來定義的就須要定義在項目的pom.xml中。具體而言,可以定義在settings.xml中的信息有:windows

  • <repositories>
  • <pluginRepositories>
  • <properties>
  • 定義在<properties>裏面的鍵值對能夠在pom.xml中使用。

profile定義在pom.xml中

定義在pom.xml中的profile能夠定義更多的信息。主要有如下這些:bash

  • <repositories>
  • <pluginRepositories>
  • <dependencies>
  • <plugins>
  • <properties>
  • <dependencyManagement>
  • <distributionManagement>

還有build元素下面的子元素,主要包括:maven

  • <defaultGoal>
  • <resources>
  • <testResources>
  • <finalName>

profile標籤配置的激活方式

  Maven給咱們提供了多種不一樣的profile激活方式。好比咱們可使用-P參數在編譯時,顯示的激活一個profile,也能夠根據環境條件的設置讓它自動激活等。ide

使用activeByDefault設置默認激活(定義在pom文件中)

<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

  咱們能夠在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定義的前後順序來進行覆蓋取值的,即後面定義的會覆蓋前面定義的。

使用-P參數顯示的激活一個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一個很是重要的特性就是它能夠根據不一樣的編譯環境來激活,好比說根據操做系統的不一樣激活不一樣的profile,也能夠根據jdk版本的不一樣激活不一樣的profile,等等。

<profiles> 
    <profile> 
        <id>profileTest1</id> 
        <jdk>1.5</jdk> 
    </profile> 
<profiles>
複製代碼

舉例-基於Springboot下的log4j2實踐配置步驟

咱們以配置log4j2爲例來講一說開發環境和生產環境的不一樣設置。

1、在src/main/resources/下新建config目錄,並在其中建立dev和release文件夾

2、分別編寫兩個不一樣環境下的log4j2配置文件

這兩個配置文件的主要區別在於,其中的日誌保存路徑是不一樣的。(此處只是爲了演示區別,隨意對路徑進行了配置,可本身配置所需路徑) 調試用的log4j2-spring.xml:

正式環境下的log4j2-spring.xml:

並分別將剛纔的兩個文件放置到對應的目錄中。

3、配置POM文件

在項目的pom.xml文件中,在其根節點project下,增長profiles標籤:

其中:

  • <profile>標籤代表當前爲一個profile描述體
  • <id>標籤代表當前profile的id,用來區分不一樣的profile
  • <properties>標籤中,能夠自定義K、V值,這裏的標籤名任意,在項目的properties或xml等配置文件中可使用${profiles.active}能夠取出」dev」或「release」這個值

在項目的pom.xml文件中,在其build節點下,增長resource標籤:

其中:

  • <directory>表示編譯所需的資源目錄
  • <excludes>標籤表示排除掉資源目錄下的某文件或文件夾
  • <targetPath>表示該資源標籤下的資源打包編譯後的保存路徑,「.」表示當前路徑 因而可知,咱們將路徑src/main/resources/config/${profiles.active}配置上了咱們在profile中定義的Key值,這樣,當咱們經過-P參數來激活配置時,就能夠引入對應的配置文件了。

4、編譯

經過執行下面的命令進行編譯:

mvn package -P dev
複製代碼

激活了dev編譯條件。編譯生成war或jar文件後,能夠解壓構建包,確認配置文件被打包到構建包的根目錄下。

總結

profile的配置是很是靈活的,經過在profile標籤下自定義一些鍵值對,並在其餘配置文件中使用這些鍵值,就能夠在編譯時指定激活的配置。本文舉例瞭如何從文件的維度,來進行配置文件的配置。相對於單一的配置鍵值對的使用來講,其實是列舉了一個包含小技巧的例子,而這個小例子也是平常咱們常常會遇到的。但願你們可以在實際運用中採用,有任何問題和錯誤之處,歡迎評論指正,不勝感激。

附錄

附Maven-profiles說明連接: Maven – Introduction to build profiles

小銘出品,必屬精品。

相關文章
相關標籤/搜索