背景介紹,問題所在
一個項目裏總會有很多配置文件,有配置文件是好事,說明項目靈活,但是有的配置文件需要區分不同的環境,即不同的環境,配置文件裏的值會有區別,我們需要根據環境的變化來修改配置文件中的值,這樣就很不爽了。
我們就遇到了這種情況,公司現在就有四套環境,本機環境(開發人員本機環境)、開發環境(開發階段,小組內自測用)、測試環境(測試團隊用)、生產環境(項目正式上線後的環境)。
在這些不同的環境下有些配置文件的值就會不一樣。比如數據庫連接配置、遠程調用配置、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-端口號的煎熬了,是個一勞永逸的辦法。