1. 程式人生 > >使用maven-war-plugin 對Maven專案進行動態打包

使用maven-war-plugin 對Maven專案進行動態打包

在進行專案釋出的時候,可能會碰到這樣的情況, 希望在保持專案原始碼不變的前提下,希望能夠針對不同的執行環境獲得相應的執行包.(比如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,否則白改了. -->