1. 程式人生 > >開發和運維那點事

開發和運維那點事

引用值 xxx war spa 領導 開發 maven打包 include 打包

今天運維和開發就環境切換問題展開了一次小小的爭論
maven打包之前配置文件是這樣的:

<context:property-placeholder location="classpath:filters/${env}.properties" />
<import resource="classpath:spring/applicationContext-service.xml" />
...
此時所有import進來的xml裏面的${xxx}引用還在

maven打包之後是這樣的:

<context:property-placeholder location="classpath:filters/test.properties" />

<import resource="classpath:spring/applicationContext-service.xml" />
...
此時所有import進來的xml裏面的${xxx}引用已經被替換成具體值

上面就是實現多環境打包的樣子,打包發布都是使勇jenkins完成,突然有一天領導說要把同樣的代碼放到另一套新的環境中去,本來可以增加一套新的properties文件完成,但是領導是跟運維說的,運維就想從tomcat/webapps解壓好的項目中改一下文件名稱,就像這樣

<context:property-placeholder location="classpath:filters/new.properties" />

直接拷貝到新的環境中運行

運維這樣想:我從解壓好的war項目中,修改配置文件裏的一個字母,就能從a環境切換到b環境

這就要求所有import進來的xml文件在打包的時候不能被替換${xxx}引用值,保持源碼狀態,開發就實現${xxx}在打包後不被替換實現了一套方案如下:
創建一個中間文件config.properties,配置成這樣

temp.key1=${key1}
temp.key2=${key2}
temp.key3=${key2}
...
然後把所有的xml文件引用的${xxx}都改成${temp.xxx}

這樣配置完成之後是這樣的,打包之後config.properties文件中會被替換成具體環境值,其他所有的xml文件保持不變,web容器啟動的時候會從config.properties中讀取對應的值,也是實現了多環境

這運維又說了這xml文件中的${temp.xxx}是沒有被替換,但是還是不能方便的切換環境,要修改config.properties中所有的配置才行,就此展開一場沒休止的爭論。。。

解決方案:
實現這種不從新打包,拿一套新的配置,修改一個字母就能切換環境
這要用到maven打包resources配置:

<resource>
<directory>src/main/resources</directory>
<includes>
<include>spring/application-config.xml</include>
<include>*/.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>spring/application-config.xml</exclude>
<exclude>*/.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>

一個includes(需要過濾)配合一個excludes(不需要過濾),第一個resource表示配置文件spring/application-config.xml和*/.properties都是需要過濾的資源文件,需要替換其中的${xxx}引用,第二個resource表示配置文件spring/application-config.xml和*/.properties以外的文件也是資源文件,但是不需要替換其中的${xxx}引用

這樣配置就能實現效果。

開發和運維那點事