maven profile動態選擇配置文件


一、背景

  在開發過程中,我們的軟件會面對不同的運行環境,比如開發環境、測試環境、生產環境,而我們的軟件在不同的環境中,有的配置可能會不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,很容易出錯,而且浪費勞動力。

  maven提供了一種方便的解決這種問題的方案,就是profile功能。

二、profile簡介

  profile可以讓我們定義一系列的配置信息,然后指定其激活條件。這樣我們就可以定義多個profile,然后每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的效果。

  profile定義的位置

(1)    針對於特定項目的profile配置我們可以定義在該項目的pom.xml中。(下面舉例是這種方式)

(2)    針對於特定用戶的profile配置,我們可以在用戶的settings.xml文件中定義profile。該文件在用戶家目錄下的“.m2”目錄下。

(3)    全局的profile配置。全局的profile是定義在Maven安裝目錄下的“conf/settings.xml”文件中的。

Spring Boot Profile

Spring Boot Profile 有許多的功能,這里只說管理配置的內容。Spring 加載配置的順序如下:

  1. Jar 包外的 application-{profile}.properties
  2. Jar 包內的 application-{profile}.properties
  3. Jar 包外的 application.properties
  4. Jar 包內的 application.properties

例如,如果我們在 application.properties 中指定

spring.profiles.active = dev

則 spring 會使用 application-dev.properties 文件中的配置來覆蓋 application.properties 文件中的相應配置。

三、配置動態打包

1、配置profile

  在項目的profile中添加如下的profile配置:

<profiles>
    <profile>
        <!-- 本地開發環境 -->
        <id>dev</id>
        <properties>
            <profiles.active>dev</profiles.active>
        </properties>
        <activation>
            <!-- 設置默認激活這個配置 -->
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <!-- 發布環境 -->
        <id>release</id>
        <properties>
            <profiles.active>release</profiles.active>
        </properties>
    </profile>
    <profile>
        <!-- 測試環境 -->
        <id>beta</id>
        <properties>
            <profiles.active>beta</profiles.active>
        </properties>
    </profile>
</profiles> 

  這里定義了三個環境,分別是dev(開發環境)、beta(測試環境)、release(發布環境),其中開發環境是默認激活的(activeByDefault為true),這樣如果在不指定profile時默認是開發環境,也在package的時候顯示指定你要選擇哪個開發環境,詳情見后面。

在編譯時指定 mvn clean install -Pprod 就能切換成 prod profile。

2.在 pom.xml 中定義資源過濾

目的是為了讓 maven 在構建時用 profile 中指定的屬性來替換 application.properties 中的內容。

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <!---->
        <excludes>
            <exclude>application*.properties</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <!---->
        <filtering>true</filtering>
        <includes>
            <include>application.properties</include>
            <include>application-${profile.active}.properties</include>
        </includes>
    </resource>
</resources>

①中,我們通過 excludes 來將所有的 application*.properties 排除在外,這樣 maven 在打包時就不會復制這些文件。畢竟我們不希望把 application-dev.properties 也包含在 prod 的 jar 包里。

②中,通過開啟 filtering,maven 會將文件中的 @XX@ 替換 profile 中定義的 XX 變量/屬性。另外,我們還通過 includes 來告訴 maven 根據profile 來復制對應的 properties 文件。

這里注意一個參數<filtering>true</filtering>,一定要設置成true.這樣才會用對應env目錄下的配置文件覆蓋原來的。

其中最重要的是<filtering>true</filtering>這段,這個配置的意思是過濾上面指定屬性文件中的占位符,占位符是${變量名稱}這樣的形式,maven會自動讀取配置文件,然后解析其中的占位符,使用上面pom文件中定義的屬性進行替換。

3.構建不同的包

mvn clean package -P<profile_name>

四、遇到的坑

  在application.xml文件中不能出現@關鍵字,就算你注釋了也不行。當出現@了,之后的所有環境變量將不會被注入

  如:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM