在進行項目發佈的時候,可能會碰到這樣的情況, 希望在保持項目源代碼不變的前提下,希望能夠針對不同的運行環境獲得相應的運行包.(比如war包)
那麼使用配置文件是可以解決這個問題的.可以將項目中和運行環境相關的一些參數 放到配置文件中, 每個環境一份,這樣,在打包前只要指定這次打包我需要指定這次打包需要哪個配置文件即可,於是就可以使運行包與環境相對應了.但是這樣的做法有個不好的 是, 配置文件的選擇需要人爲干涉——如果碰到這樣的情況:某某,你給我**環境的包. 這個時候, 採用平時的做法就是馬上回憶我要去改下哪個地方, 讓項目知道我要用什麼配置了.
現在有另一個做法, 使用maven-war-plugin這個插件可以在執行打包命令的時候指定我要打哪個環境的包, 而不需要去關注我現在要用什麼配置文件了.當然只適用於Maven項目.
例如: maven package –P youEnvName 這樣你就可以打出一個youEnvName環境的的運行包了.
第1步 還是要爲不同環境準備不同的運行參數: 這裏在src/main/resources 目錄下建兩個文件,分別用來配置兩個環境的一些不同參數.注意,配置文件需要是一個合法的properties文件:如:
src/main/resources/IProject-test.properties src/main/resources/IProject-real.properties
分別對應測試和正式兩個環境. 裏面的內容當然就是兩個key一個value不一個的key-value對了.
src/main/resources/IProject-test.properties 中的內容通常是這樣(僅僅是樣例)
system.envid=real method.version=1.0.0. release ………
第 2 步 ,在src/main下面新建一個目錄,例如:src/main/packageFilter
然後將你要用到這個幾個參數的那一個或多個配置文件文件找出來(通常這些配置文件是在WEB-INF目錄中的),將他們移動到src/main/packageFilter目錄中去.(這個時候你可能會問:配置文件換地方了,項目懂嗎? 先不着急.)df
這些配置到src/main/packageFilter目錄中後,要對其中的使用上面配置的那幾個參數作一下修改(僅僅是樣例)
<bean id="myService" class="com.nileader.MyService" init-method="init"> <property name="version"> <value>${ system.envid }</value> </property> </bean>
這裏看到了吧, 參數已經用一個${key} 的佔位符.
第3步 ,在pom文件添加打包插件的依賴:
<filters> <filter> src/main/resources/IProject-test.properties </filter> </filters> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>src/main/packageFilter</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource> </webResources> </configuration> </plugin>
這裏就可以解決剛纔提到的那個問題了,配置文件看上去已經移動了,但是並不需要告訴你的項目,其實在項目加載配置文件的時候,我們已經將一個完整的,不包含任何佔位符的配置放在了項目本應該放的位置 ,這裏由下面這段配置實現的:
<resource> <directory>src/main/packageFilter</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource>
這段配置的意思是: 在打包的時候,要將<directory>src/main/packageFilter</directory>中的文件全部搬到
<targetPath>WEB-INF</targetPath>
目錄中去,並且這個過程是覆蓋的. 同時<filtering>true</filtering>指定了在這個”搬運”過程中,需要進行過濾.
另外,這裏還有個標籤: <filters>….</filters> 先不講
好了,新的問題出來了,什麼是過濾.現在進入最後一個步驟.
第4步 , 還是在pom.xml文件中, 配置如下信息:
<profiles>
profile for bulid
<profile>
<id>test</id>
<build>
<filters>
<filter> src/main/resources/IProject-test.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>real</id>
<build>
<filters>
<filter> src/main/resources/IProject-real.properties</filter>
</filters>
</build>
</profile>
</profiles>
好了,現在知道了吧, 根據單詞filter可以猜到這個配置是幹嘛了.他的工作過程就是在打包的時候,
使用命令
mvn package –P real.
那麼他就會找到<id>real</id>對應的那個參數信息src/main/resources/IProject- real.properties, 然後用其中的key-value對來過濾<directory>src/main/packageFilter< /directory>中的文件,並將填充完整後的配置文件全部搬運到<targetPath>WEB-INF</targetPath>中去.另外,由於配置<plugin>的時候留下一個標籤
<filters> <filter> src/main/resources/IProject-test.properties </filter> </filters> <plugin> ……..
這個就是所謂的默認參數,也就是當你執行 mvn package,他默認使用這個文件中的參數來過濾,相當於執行
mvn package –P test.
如何調試.
從這裏介紹的方法可以看出, 配置文件中的參數是在打包的時候纔會被真正填充進去的, 那麼對於那種希望在Eclipse中調試的項目怎麼辦.(例如用Jetty插件來調試Maven項目的時候, 並不會將項目打包後來執行, 而是直接運行src/main/webapp作爲項目root路徑.)
上面已經提到了,maven-war-plugin 在工作過程中是把 <directory>src/main/packageFilter</directory> 中的文件全部搬到 <targetPath>WEB-INF</targetPath>下,並且是覆蓋.
所以可以這樣處理,在開發 調試的時候,可以在配置文件的目錄中放上完整的配置文件,裏面的填充需要的參數,這位就可以順利進行調試了, 並且不影響打包.
注意事項
現在可以調試了,但是要注意, 在開發調試過程中,如果對這個配置文件有改動,一定要反映到模板文件中去,所以建議在這個需要被填充的配置中添加上一些註釋,可以提醒自己:
<!-- 注意,對這個文件的任何修改必須同步到文件:src/main/packageFilter/****.xml,否則白改了. -->