最近在做項目中,用Maven管理項目間的依賴關系,遇到一個問題,快折騰死了,不過初步試出來一種解決方案。在此把問題及解決方案描述一下,以資共享。
問題描述:有兩個項目A和B,Dynamic Web Project。依賴關系是,B-->A,一種方式是利用maven-war-plugin的Overlay機制(例子可參見官網),但這種解決方案默認是將兩個Web應用的資源進行合並,相關的class都會被復制到WEB-INF/classes下面,相關的JSP等資源也合並到一起。我的要求是A的class被獨立打包成一個jar,在發布到應用服務器后存在於B應用的WEB-INF/lib下面,A應用的其他資源都不要。
處理思路:
一、A應用的POM處理
<?xml version="1.0" encoding="UTF-8"?>
<project ......">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<version>0.0.1-SNAPSHOT</version>
<name>A-web</name>
<artifactId>A-web</artifactId>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<!--注意增加這兩行,在打包時相關的類會被獨立打成jar-->
<attachClasses>true</attachClasses>
<classesClassifier>api</classesClassifier>
</configuration>
<version>2.3</version>
<executions>
</executions>
</plugin>
</plugins>
</build>
</project>
打包完成后,包含A-web.war和a-web-api.jar及其他文件。
二、B應用的POM處理
<?xml version="1.0" encoding="UTF-8"?>
<project ...........>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<version>0.0.1-SNAPSHOT</version>
<name>B</name>
<artifactId>B</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>A-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<classifier>api</classifier>
</dependency>
</dependencies>
</project>
注意以上的依賴中的type屬性為jar,而不是默認的war。classifier的值api與A中的classesClassifier的值api要一致。