Maven多模块项目可插拔式打包部署方案(二)
需求回顾
随着【train-hubs】和【train-hubs-ztrip】这两个项目的合并,我们需要实现将这一个项目打包成不同的Jar包以致于能达到不同的运行效果,通俗来说就是将项目打包成两个不同的Jar包,其中一个Jar包的业务功能是完整的,而另一个Jar包的业务功能是残缺的。(具体的需求描述可以查看上一篇文章,也就是打包部署方案的第一篇文章)。
方案调研
解决方案
使用maven-jar-plugin和maven-assembly-plugin定制化打包成两个不同的tar包,tar包里面包含一个不含依赖Jar包的标准可执行Jar文件和一个包含依赖Jar包的lib目录。
实现原理
- 使用maven-assembly-plugin插件的<descriptors>标签指定好定制化打包的配置文件(XML文件)
- 在打包配置文件中配置<dependencySets>标签将依赖Jar包输出到指定的lib目录,这个功能也是整个方案实现的精髓所在,利用<excludes>标签排除依赖Jar包以达到功能插拔的效果;
- 使用maven-jar-plugin插件将项目打包成一个不含依赖Jar包的标准可执行Jar,并且在META-INF/MANIFEST.MF清单文件中添加Class-Path属性,用于引用依赖Jar包;
- 在打包配置文件中配置<fileSets>标签将lib目录以及maven-jar.jar打包成一个指定格式的tar包;
代码实现
在maven-jar模块下修改pom.xml
<?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">
<parent>
<artifactId>maven-package</artifactId>
<groupId>com.maven</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-jar</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.maven</groupId>
<artifactId>maven-outside</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.maven</groupId>
<artifactId>maven-inside</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- jar所在地 -->
<archive>
<manifest>
<!-- 启动类 -->
<mainClass>com.maven.AppMaven</mainClass>
<!-- 添加类路径前缀,因为最终的依赖包会放在lib目录下 -->
<classpathPrefix>lib</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>maven</finalName>
<appendAssemblyId>true</appendAssemblyId>
<descriptors>
<!-- 配置打包方式assembly.xml文件路径 -->
<descriptor>src/main/assembly/package-all.xml</descriptor>
<descriptor>src/main/assembly/package-inside.xml</descriptor>
</descriptors>
<outputDirectory>target</outputDirectory>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在maven-jar模块下新增/src/main/assembly/package-all.xml
<?xml version="1.0" encoding="utf-8"?>
<assembly>
<id>all</id>
<!--最终打包成一个用于发布的zip文件 -->
<formats>
<format>tar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- 配置文件 -->
<fileSet>
<!-- 包括mvn-jar-plugin 生成jar -->
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<!-- 不使用项目的artifact,第三方jar不要解压,打包进tar.gz文件的lib目录
配置项目第三方provided、system、runtime不同方式的jar打包进lib目录 -->
<unpack>false</unpack>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
在maven-jar模块下新增/src/main/assembly/package-inside.xml
<?xml version="1.0" encoding="utf-8"?>
<assembly>
<id>inside</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>tar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- 配置文件 -->
<fileSet>
<!-- 包括mvn-jar-plugin生成jar -->
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<!-- 不使用项目的artifact,第三方jar不要解压,打包进tar.gz文件的lib目录
配置项目第三方provided、system、runtime不同方式的jar打包进lib目录 -->
<unpack>false</unpack>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>/lib</outputDirectory>
<excludes>
<!-- 排除assembly模块的jar包 -->
<exclude>com.maven:maven-outside:jar:${project.version}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
打包运行效果
mvn clean package