1. 程式人生 > >Maven中如何配置WAR依賴WAR包

Maven中如何配置WAR依賴WAR包

專案背景:

1.     war專案Cwar專案B都依賴war專案AJAR專案D. 專案A中儲存了BC專案通用的web資源,比如通用的javascript,CSS,jsp. 專案D中儲存了BC專案中都依賴的一些class

2.     開發人員希望每次都只面對一個專案,Team A 開發專案A, Team B開發專案B, Team C開發專案C,以此類推

3.     每個Team在開發自己專案時,都希望能直接進行除錯,例如war專案A可以直接部署到TOMCAT上執行測試

4.     最後實際交付給客戶的卻只有2個專案: BC 。也就是說,最後要打包BC,而在BCwar

包中都要包含A中的web資源和D中的class

解決思路:

使用maven-warpath-plugin外掛來解決WAR所依賴的WAR

解決方案:

<dependency>

<groupId>com.isoftstone.gads</groupId>

<artifactId>common-web</artifactId>

<version>0.0.1-SNAPSHOT</version>

<type>war</type>

</dependency>

<dependency>

<groupId>com.isoftstone.gads</groupId>

<artifactId>common-web</artifactId>

<version>0.0.1-SNAPSHOT</version>

<type>warpath</type>

</dependency>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</

artifactId>

<version>2.1-beta-1</version>

<configuration>

<!預設會變成在target/war/work導致被打包進war檔案,指定後為target/work->

<workDirectory>${project.build.directory}/work</workDirectory>

<webappDirectory>WebContent</webappDirectory>

<useCache>false</useCache>

<archive>

<addMavenDescriptor>true</addMavenDescriptor>

</archive>

<overlays>

<overlay>

<groupId>com.isoftstone.gads</groupId>

<artifactId>ebiz-common-web</artifactId>

</overlay>

<overlay>

<!-- empty groupId/artifactId is detected as the current build -->

<!-- 代表當前WAR專案,預設情況下當前WAR專案是先被拷貝的,如果要控制其順序,則使用空的overlay -->

<!-- any other overlay will be applied after the current build since they have not been configured in the overlays

element -->

</overlay>

</overlays><dependentWarExcludes>*/web.xml,WEB-INF/lib/*,/sql-map-config.xml,/jdbc.properties,/META-INF/*</dependentWarExcludes>

</configuration>

</plugin>

<plugin>

<groupId>org.appfuse.plugins</groupId>

<artifactId>maven-warpath-plugin</artifactId>

<version>2.1.0-M1</version>

<extensions>true</extensions>

<executions>

<execution>

<goals>

<goal>add-classes</goal>

</goals>

</execution>

</executions>

<configuration><!-- below WEB-INF/classes -->

<warpathExcludes>**/logback-test.xml</warpathExcludes>

</configuration>

</plugin>

注意紅色部分,說明如下:

1.     首先是使用了maven-warpath-plugin外掛,處理所有<type>warpath</type>artifact,這個外掛可以將從依賴的WAR中傳遞的依賴都打包到當前的WAR,沒有這個外掛時,當前WAR從所依賴的WAR artifact那所傳遞來的依賴在打包成WAR時都會被忽略.既然現在能將傳遞的依賴打包了,就不用copy依賴的war中的WEB-INF/lib/*,所以被加入到<dependentWarExcludes>

2.     <workDirectory>的設定看我寫的註釋

3.     webappDirectory的指定需要額外注意.首先,我使用了MAVEN預設的資源路徑,也就是 src/main/webapp,而這裡卻告訴maven-war-plugin另一個路徑"WebContent",產生的結果就是,執行mvn package,war-pluginwarpath-plugin會將當前war和所有依賴的warweb資源都拷貝到WebContent目錄下.這樣,WebContent目錄包含的內容就是最終打包成WAR的內容了.