Maven中如何配置WAR依賴WAR包
專案背景:
1. war專案C和war專案B都依賴war專案A和JAR專案D. 專案A中儲存了B和C專案通用的web資源,比如通用的javascript,CSS,jsp等. 專案D中儲存了B和C專案中都依賴的一些class
2. 開發人員希望每次都只面對一個專案,即Team A 開發專案A, Team B開發專案B, Team C開發專案C,以此類推
3. 每個Team在開發自己專案時,都希望能直接進行除錯,例如war專案A可以直接部署到TOMCAT上執行測試
4. 最後實際交付給客戶的卻只有2個專案: B和C 。也就是說,最後要打包B和C,而在B和C的war
解決思路:
使用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</
<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-plugin和warpath-plugin會將當前war和所有依賴的war的web資源都拷貝到WebContent目錄下.這樣,WebContent目錄包含的內容就是最終打包成WAR的內容了.