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

xNPE發表於2018-08-08

概述

  在實際專案開發中,我們需要根據不同的使用場景,構建不同的程式包。當使用Maven編譯時,我們可以通過Maven的profile標籤來配置編譯選項,從而達到生成不同構建產物的目的。例如,在開發環境下,我們有一套適用於本機的除錯配置;而在生產環境下,又需要關閉除錯環境時的大量除錯日誌,或變更日誌儲存路徑等。這些需求都可以通過Maven的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設定預設啟用(定義在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在編譯時預設會被啟用

在settings.xml中使用activeProfiles指定處於啟用狀態的profile

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

<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為例來說一說開發環境和生產環境的不同設定。

一、在src/main/resources/下新建config目錄,並在其中建立dev和release資料夾

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

二、分別編寫兩個不同環境下的log4j2配置檔案

這兩個配置檔案的主要區別在於,其中的日誌儲存路徑是不同的。(此處只是為了演示區別,隨意對路徑進行了配置,可自己配置所需路徑) 除錯用的log4j2-spring.xml:

Maven根據pom檔案中的Profile標籤動態配置編譯選項
正式環境下的log4j2-spring.xml:

Maven根據pom檔案中的Profile標籤動態配置編譯選項
並分別將剛才的兩個檔案放置到對應的目錄中。

三、配置POM檔案

在專案的pom.xml檔案中,在其根節點project下,增加profiles標籤:

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

其中:

  • <profile>標籤表明當前為一個profile描述體
  • <id>標籤表明當前profile的id,用來區分不同的profile
  • <properties>標籤中,可以自定義K、V值,這裡的標籤名任意,在專案的properties或xml等配置檔案中可以使用${profiles.active}可以取出”dev”或“release”這個值

在專案的pom.xml檔案中,在其build節點下,增加resource標籤:

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

其中:

  • <directory>表示編譯所需的資源目錄
  • <excludes>標籤表示排除掉資源目錄下的某檔案或資料夾
  • <targetPath>表示該資源標籤下的資源打包編譯後的儲存路徑,“.”表示當前路徑 由此可見,我們將路徑src/main/resources/config/${profiles.active}配置上了我們在profile中定義的Key值,這樣,當我們通過-P引數來啟用配置時,就可以引入對應的配置檔案了。

四、編譯

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

mvn package -P dev
複製程式碼

啟用了dev編譯條件。編譯生成war或jar檔案後,可以解壓構建包,確認配置檔案被打包到構建包的根目錄下。

總結

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

附錄

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

小銘出品,必屬精品。

相關文章