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

Maven多模块项目可插拔式打包部署方案(二)

      • 需求回顾
      • 方案调研
        • 解决方案
        • 实现原理
        • 代码实现
        • 打包运行效果
          • 解压tar包
          • 完整Jar包运行测试
          • 残缺Jar包运行测试

需求回顾

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

方案调研

解决方案

使用maven-jar-plugin和maven-assembly-plugin定制化打包成两个不同的tar包,tar包里面包含一个不含依赖Jar包的标准可执行Jar文件和一个包含依赖Jar包的lib目录。
Mr. Cappuccino的第51杯咖啡——Maven多模块项目可插拔式打包部署方案(二)_第1张图片

实现原理

  1. 使用maven-assembly-plugin插件的标签指定好定制化打包的配置文件(XML文件)

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

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

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

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

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

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

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

  1. 在打包配置文件中配置标签将lib目录以及maven-jar.jar打包成一个指定格式的tar包;

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

代码实现

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

在maven-jar模块下修改pom.xml


<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-packageartifactId>
        <groupId>com.mavengroupId>
        <version>${revision}version>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>maven-jarartifactId>
    <packaging>jarpackaging>

    <dependencies>
        <dependency>
            <groupId>com.mavengroupId>
            <artifactId>maven-outsideartifactId>
            <version>${project.version}version>
        dependency>
        <dependency>
            <groupId>com.mavengroupId>
            <artifactId>maven-insideartifactId>
            <version>${project.version}version>
        dependency>
    dependencies>

    <build>
        <finalName>${project.artifactId}finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-jar-pluginartifactId>
                <configuration>
                    
                    <archive>
                        <manifest>
                            
                            <mainClass>com.maven.AppMavenmainClass>
                            
                            <classpathPrefix>libclasspathPrefix>
                            <addClasspath>trueaddClasspath>
                        manifest>
                    archive>
                configuration>
            plugin>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-assembly-pluginartifactId>
                <configuration>
                    <finalName>mavenfinalName>
                    <appendAssemblyId>trueappendAssemblyId>
                    <descriptors>
                        
                        <descriptor>src/main/assembly/package-all.xmldescriptor>
                        <descriptor>src/main/assembly/package-inside.xmldescriptor>
                    descriptors>
                    <outputDirectory>targetoutputDirectory>
                configuration>
                <executions>
                    <execution>
                        <id>make-assemblyid>
                        <phase>packagephase>
                        <goals>
                            <goal>singlegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>

project>

在maven-jar模块下新增/src/main/assembly/package-all.xml


<assembly>
    <id>allid>
    
    <formats>
        <format>tarformat>
    formats>
    <includeBaseDirectory>falseincludeBaseDirectory>
    <fileSets>
        
        <fileSet>
            
            <directory>targetdirectory>
            <outputDirectory>/outputDirectory>
            <includes>
                <include>*.jarinclude>
            includes>
        fileSet>
    fileSets>

    <dependencySets>
        <dependencySet>
            
            <unpack>falseunpack>
            <useProjectArtifact>falseuseProjectArtifact>
            <outputDirectory>/liboutputDirectory>
        dependencySet>
    dependencySets>
assembly>

在maven-jar模块下新增/src/main/assembly/package-inside.xml


<assembly>
    <id>insideid>
    
    <formats>
        <format>tarformat>
    formats>
    <includeBaseDirectory>falseincludeBaseDirectory>
    <fileSets>
        
        <fileSet>
            
            <directory>targetdirectory>
            <outputDirectory>/outputDirectory>
            <includes>
                <include>*.jarinclude>
            includes>
        fileSet>
    fileSets>

    <dependencySets>
        <dependencySet>
            
            <unpack>falseunpack>
            <useProjectArtifact>falseuseProjectArtifact>
            <outputDirectory>/liboutputDirectory>
            <excludes>
                
                <exclude>com.maven:maven-outside:jar:${project.version}exclude>
            excludes>
        dependencySet>
    dependencySets>
assembly>

打包运行效果

mvn clean package

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

解压tar包

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

完整Jar包运行测试

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

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

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

残缺Jar包运行测试

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

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

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

你可能感兴趣的:(Maven,maven,mr,java)