Maven利用Profile構建不同環境的部署包

背景介紹,問題所在

一個項目裏總會有很多配置文件,有配置文件是好事,說明項目靈活,但是有的配置文件需要區分不同的環境,即不同的環境,配置文件裏的值會有區別,我們需要根據環境的變化來修改配置文件中的值,這樣就很不爽了。

我們就遇到了這種情況,公司現在就有四套環境,本機環境(開發人員本機環境)、開發環境(開發階段,小組內自測用)、測試環境(測試團隊用)、生產環境(項目正式上線後的環境)。

在這些不同的環境下有些配置文件的值就會不一樣。比如數據庫連接配置、遠程調用配置、shiro-cas配置、日誌路徑配置等等這些都是很常見的。所以在構建之前,要根據環境的不同來手動修改配置文件相應的值,然後提交svn,在通過Jenkins構建部署到不同的環境下。這大大增加了開發者的工作量,而且稍不注意就會出錯,搞的大家怨聲載道。

經過研究發現Maven中的profile可以幫助咱們解決這些問題。

項目爲例,如何解決

下面以我們的項目爲例,來看看Maven是如何解決這個問題的

① 爲每個環境添加配置文件

目錄結構如下:

這裏寫圖片描述

將那些會根據環境不同而變化的配置值填寫到對應的配置文件中,比如下面的舉例。

本地環境 local.properties:

#shiro-cas配置
loginUrl=http://192.168.22.246:8888/cas/login?service=http://localhost:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://localhost:8091/itoo-basic-editTrainingprogram-web/shiro-cas
#日誌路徑
logPath=d:/
#Redis IP 端口
redisIp=192.168.22.246
redisPort=6379

開發環境 dev.properties:

#shiro-cas配置
loginUrl=http://192.168.22.246:8888/cas/login?service=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
#日誌路徑
logPath=/usr/itoo-basic-log/
#Redis IP 端口
redisIp=192.168.22.246
redisPort=6379

測試環境 test.properties:

#shiro-cas配置
loginUrl=http://192.168.22.210:8888/cas/login?service=http://192.168.22.211:8091/itoo-basic-edittrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.210:8888/cas
casService=http://192.168.22.211:8091/itoo-basic-edittrainingprogram-web/shiro-cas
#日誌路徑
logPath=/usr/itoo-basic-log/
#Redis IP 端口
redisIp=192.168.22.210

redisPort=6379

PS:日誌路徑問題,本機開發爲windows環境,路徑爲D:\xxx;開發環境,測試環境等都是Linux環境,路徑爲/usr/xxx/xx。格式不一樣要做區分。

② 修改項目原有的配置文件

比如shiro-cas.properties、log4j.xml、redisHost.properties,將原來寫的死值,也就是每次需要修改的地方,替換成變量:${xxx}

shiro-cas.properties

loginUrl=${loginUrl}
casServerUrlPrefix=${casServerUrlPrefix}
casService=${casService}

log4j.xml

    <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${logPath}editTrainingprogram-default.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="false" />
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
        </layout>
    </appender>

redisHost.properties

host=${host}
port=${port}

③ 修改項目的pom.xml 文件

添加下面文件(直接複製即可,不區分系統和模塊)

        <profiles>
                <profile>
                        <!-- 本地環境 -->
                        <id>local</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/local.properties</filter>
                                </filters>
                        </build>
                        <!-- 默認激活本環境 -->
                        <activation>
                                <activeByDefault>true</activeByDefault>
                        </activation>
                </profile>
                <profile>
                        <!-- 開發環境 -->
                        <id>dev</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/dev.properties</filter>
                                </filters>
                        </build>
                </profile>
                <profile>
                        <!-- 生產環境 -->
                        <id>prod</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/prod.properties</filter>
                                </filters>
                        </build>
                </profile>
                <profile>
                        <!-- 測試環境 -->
        <id>test</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/test.properties</filter>
                                </filters>
                        </build>
                </profile>
        </profiles>

        <build>
                <!-- 指定需要編譯的目錄 -->
                <resources>
                        <resource>
                                <directory>src/main/resources</directory>
                                <!--可以在此配置過濾文件  -->
                                <includes>
                                        <include>**/*.xsd</include>
                                        <include>**/*.properties</include>
                                        <include>**/*.xml</include>
                                </includes>
                                <!--開啓filtering功能  -->
                                <filtering>true</filtering>
                        </resource>
                </resources>
        </build>

上面的配置:

1. 通過不同的profile指定不同環境的id和對應的配置文件。

2. 通過resources 指定要編譯的目錄,過濾哪些配置文件,項目中實際用到的配置文件。意思是對src/main/resources目錄下的配置文件進行佔位符替換。

④ 通過maven編譯打包,測試效果

在對應的pom.xml文件,右鍵Run as –> Maven Build->輸入install –Pxxx,xxx指定是哪個環境id,也就是咱們在pom.xml中配置的profile的Id。

假如不指定 -P 參數的話,則會使用 activeByDefault=true 的一項(即 local)。

比如開發環境執行:clean install –Pdev
打包後配置文件:

shiro-cas.properties

loginUrl=http://192.168.22.246:8888/cas/login?service=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas

log4j.xml

    <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/usr/itoo-basic-log/editTrainingprogram-default.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="false" />
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
        </layout>
    </appender>

redisHost.properties

host=192.168.22.246
port=6379

比如生產環境:clean install –Pprod
測試環境執行:clean install –Ptest


另外:如果使用Jenkins集成

因爲咱們的每一套環境都由相應的Jenkins來完成持續集成的工作(包含maven Build工作),所以需要修改每個模塊的Jenkins配置:如果是開發環境就在deploy後添加-Pdev,生產環境就添加-Pprod,測試就添加-Ptest。

這裏寫圖片描述



小結

簡單來說,Maven多環境打包原理就是,事先建立好各個環境的配置文件,寫好對應的值,比如dev.properties、test.properties、prod.properties,然後在項目打包發佈的時候,用命令指定使用一個環境的配置文件,用其實際內容來替換項目配置文件中的佔位符。

經過這樣配置完後,咱們就再也不用受各種環境IP-端口號的煎熬了,是個一勞永逸的辦法。

發佈了189 篇原創文章 · 獲贊 472 · 訪問量 74萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章