【轉】maven profile實現多環境打包


  作為一名程序員,在開發的過程中,經常需要面對不同的運行環境(開發環境、測試環境、生產環境、內網環境、外網環境等等),在不同的環境中,相關的配置一般不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置。每次在不同環境部署程序時,都需要修改相應的配置文件,使之完成環境的配置。這么做存在一個比較大的問題:每次修改配置非常麻煩,而且配置錯誤會產生不可預估的影響,比如,在發布生產環境時用的開發環境的配置還好,但如果在開發環境下用生產環境的數據,將會造成生產數據的污染,導致生產環境崩潰。

    目前JAVA相關的項目基本都是使用Maven來進行構建。在maven中實現多環境的構建可移植性需要使用profile,通過不同的環境激活不同的profile來達到構建的可移植性。

 

一、POM中profile的配置

首先是profile配置,在pom.xml中添加如下profile的配置:

<profiles>
    <profile>
        <!-- 本地開發環境 -->
        <id>dev</id>
        <properties>
            <profiles.active>dev</profiles.active>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <!-- 測試環境 -->
        <id>test</id>
        <properties>
            <profiles.active>test</profiles.active>
        </properties>
    </profile>
    <profile>
        <!-- 生產環境 -->
        <id>pro</id>
        <properties>
            <profiles.active>pro</profiles.active>
        </properties>
    </profile>
</profiles>

 

這里定義了三個環境,dev(開發環境)、test(測試環境)、pro(生產環境),其中開發環境是默認激活的(activeByDefault為true),這樣如果在不指定profile時默認是開發環境。

同時每個profile還定義了兩個屬性,其中profiles.active表示被激活的profile的配置文件的目錄。

二、工程目錄

針對不同的環境,我們定義不同的配置文件,而這些配置文件都做為資源文件放到maven工程的resources目錄下,即src/main/resources目錄下,且各個環境的配置分別放到相應的目錄下,而所有環境都公用的配置,直接放到src/main/resources目錄下即可。如下圖所示:
目錄結構

如圖所示,開發環境、測試環境、生產環境的配置文件分別放到src/main/resources目錄下的dev、test、pro三個子目錄中,剩余公共的配置文件放於resources目錄下。

三、POM文件中build配置

在pom中的build節點下,配置資源文件的位置,如下所示:

  <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 資源根目錄排除各環境的配置,防止在生成目錄中多余其它目錄 -->
                <excludes>
                    <exclude>test/*</exclude>
                    <exclude>pro/*</exclude>
                    <exclude>dev/*</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources/${profiles.active}</directory>
            </resource>
        </resources>
    </build>

 

首先第一個資源文件位置src/main/resources需要排隊提各個環境的配置文件,各個環境的配置我們在第二個節點中通過前面在profile中配置的profiles.active屬性來指定。即src/main/resources/${profiles.active}。這樣在激活指定的profile時,會加載指定目錄下的配置文件,如當前激活的是pro profile,那么這個資源目錄就是src/main/resources/pro。這樣就達到了不同環境加載不同配置的目的。

五、項目編譯生成

所有需要的配置就完成了,通過在運行maven命令時指定不同的profile即可構建不同環境需要的war包或發布到不同的環境了 。如:

mvn clean package -Ppro即構建出生產環境需要的war包

由於默認的profile是dev,所以如果我們不指定profile,那么加載就是開發環境dev下的配置文件了。即我們在本地開發測試時,不用關心profile的問題。

其它方法

在resource節點中可以增加如下節點

<resource>
    <directory>src/main/resources</directory>
    <!-- 資源根目錄排除各環境的配置,使用單獨的資源目錄來指定 -->
    <excludes>
        <exclude>test/*</exclude>
        <exclude>pro/*</exclude>
        <exclude>dev/*</exclude>
    </excludes>
    <filtering>true</filtering>
</resource>

 

在某個resource中如果設置filtering為true,將會根據輸入參數動態修改相關內容。

配置文件app.config中為

url=${url}

方式一,使用profile的properties

<properties>
    <profiles.active>test</profiles.active>
    <url>localhost</url>
</properties>

  

maven在resources過程中會替換為localhost

方式二,使用命令參數-D

mvn clean package -Durl=localhost

同樣的效果,都會copy資源文件的時候設置這個url的參數

參考鏈接

http://maven.apache.org/guides/introduction/introduction-to-profiles.html
http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/
http://blog.csdn.net/mhmyqn/article/details/24501281


免責聲明!

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



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