Mr. Cappuccino的第51杯咖啡——Maven多模块项目可插拔式打包部署方案(二)

需求回顾

随着【train-hubs】和【train-hubs-ztrip】这两个项目的合并,我们需要实现将这一个项目打包成不同的Jar包以致于能达到不同的运行效果,通俗来说就是将项目打包成两个不同的Jar包,其中一个Jar包的业务功能是完整的,而另一个Jar包的业务功能是残缺的。(具体的需求描述可以查看上一篇文章,也就是打包部署方案的第一篇文章)。

方案调研

解决方案

使用maven-jar-plugin和maven-assembly-plugin定制化打包成两个不同的tar包,tar包里面包含一个不含依赖Jar包的标准可执行Jar文件和一个包含依赖Jar包的lib目录。
在这里插入图片描述

实现原理
  1. 使用maven-assembly-plugin插件的<descriptors>标签指定好定制化打包的配置文件(XML文件)

在这里插入图片描述

  1. 在打包配置文件中配置<dependencySets>标签将依赖Jar包输出到指定的lib目录,这个功能也是整个方案实现的精髓所在,利用<excludes>标签排除依赖Jar包以达到功能插拔的效果;

在这里插入图片描述

在这里插入图片描述

  1. 使用maven-jar-plugin插件将项目打包成一个不含依赖Jar包的标准可执行Jar,并且在META-INF/MANIFEST.MF清单文件中添加Class-Path属性,用于引用依赖Jar包;

在这里插入图片描述

在这里插入图片描述

  1. 在打包配置文件中配置<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

在这里插入图片描述
在这里插入图片描述

解压tar包

在这里插入图片描述

完整Jar包运行测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

残缺Jar包运行测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_41888963/article/details/130149798