最近在做项目中,用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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ps.uzkefu</groupId>
<artifactId>uzkefu</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>uzkefu</name>
<description>uzkefu</description>
<parent>
<groupId>com.ps.uzkefu</groupId>
<artifactId>ps</artifactId>
<version>1.0</version>
</parent>
<dependencies>
</dependencies>
<build>
<finalName>uzkefu</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 打成jar包 供B项目依赖-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>make-a-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<excludes>
<!-- 排除定时任务和 socket server 和 ctilink不需要的class-->
<exclude>com/ps/uzkefu/ServletInitializer.class</exclude>
<exclude>com/ps/uzkefu/apps/common/ScheduleJob.class</exclude>
<exclude>com/ps/uzkefu/common/im/*</exclude>
<exclude>com/ps/uzkefu/apps/setting/service/job/FileJobQueueRunner.class</exclude>
<exclude>com/ps/uzkefu/apps/setting/service/job/FileJobQueueHandler.class</exclude>
</excludes>
<classifier>api</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包完成后,包含uzkefu.war和uzkefu-api.jar及其他文件。
二、B应用的POM处理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ps.uzkefu</groupId>
<artifactId>ctilink</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>ctilink</name>
<description>ctilink</description>
<parent>
<groupId>com.ps.uzkefu</groupId>
<artifactId>ps</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<!-- B项目依赖A-->
<dependency>
<groupId>com.ps.uzkefu</groupId>
<artifactId>uzkefu</artifactId>
<version>1.0</version>
<type>jar</type>
<scope>compile</scope>
<classifier>api</classifier>
</dependency>
</dependencies>
<build>
<finalName>ctilink</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意以上的依赖中的type属性为jar,而不是默认的war。classifier的值api与A中的classesClassifier的值api要一致。