maven-assembly-plugin和maven-shade-plugin 使用

举报
xiewenci 发表于 2022/07/30 17:25:25 2022/07/30
【摘要】 maven-assembly-plugin和maven-shade-plugin 使用

一、maven-assembly-plugin

1. 插件功能

maven-assembly-plugin 它是maven中针对打包任务而提供的标准插件,可以具体指定该包的类型,包里面包含哪些内容等。

官网地址:http://maven.apache.org/plugins/maven-assembly-plugin/

2. 使用内置Assembly Descriptor

默认情况下,maven-assembly-plugin内置了几个可以用的assembly descriptor:

  • bin : 类似于默认打包,会将bin目录下的文件打到包中;

  • jar-with-dependencies : 会将所有依赖都解压打包到生成物中;

  • src :只将源码目录下的文件打包;

  • project : 将整个project资源打包。

    example:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    
        <executions>
            <execution>
                <goals>
                    <goal>attached</goal>
                </goals>
                <phase>package</phase>
            </execution>
        </executions>
    </plugin>
    

3. 自定义Assembly Descriptor

  • 先在pom文件申明assembly插件,然后指定打包描述文件(如下面的package.xml)
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>${maven-assembly-plugin.version}</version>
    <executions>
        <execution>
			<!--名字任意 -->
            <id>make-assembly</id>
			<!-- 绑定到package生命周期阶段上 -->
            <phase>package</phase>
            <goals>
				<!-- 该打包任务只运行一次 -->
                <goal>single</goal>
            </goals>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <!--assembly描述符文件-->
                    <descriptor>package.xml</descriptor>
                </descriptors>
                    <!--打包后的文件名称-->
                <finalName>${project.parent.name}-${service.version}</finalName>
            </configuration>
        </execution>
    </executions>
</plugin>
  • Assembly描述符文件详解

    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
        
        <!-- id 标识符,添加到生成文件名称的后缀符。如果指定 id 的话(这里指定的是项目的版本),目标文件则是 ${artifactId}-${id}.jar。【如terminal-dispatch-5.0.0.0.jar】 -->
        <id>${project.version}</id>
        
        <!-- 指定打包格式。maven-assembly-plugin插件支持的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同时指定多个打包格式 -->
        <formats>
            <format>jar</format>
        </formats>
        
        <!-- 指定打的包是否包含打包层目录(比如finalName是terminal-dispatch,当值为true,所有文件被放在包内的terminal-dispatch目录下,否则直接放在包的根目录下)-->
        <includeBaseDirectory>true</includeBaseDirectory>
        
        <!-- 指定将工程依赖的包打到包里的指定目录下 -->
        <dependencySets>
            <dependencySet>
                <useProjectArtifact>true</useProjectArtifact> <!-- 指定打包时是否包含工程自身生成的jar包 -->
                <outputDirectory>lib</outputDirectory> <!-- 指定将这些依赖包打到包里lib目录下 -->
                <scope>runtime</scope> <!-- 用于管理依赖的部署,runtime表示只在运行时使用 -->
            </dependencySet>
        </dependencySets>
        
        <!-- 指定要包含的文件集,可以定义多个fileSet -->
        <fileSets>
            <fileSet>
                <directory>src/main/script/linux/bin</directory> <!-- 指定归档文件(要打的jar包)要包含的目录(下的文件及文件夹) -->
                <outputDirectory>bin</outputDirectory> <!-- 指定要将当前目录(<directory>标签中的目录放在归档文件(要打的jar包)bin目录下) -->
                <includes>
                    <include>terminal-dispatch</include> <!-- 精确控制要包含的文件,<exclude>用于精确控制要排除的文件  -->
                    <include>server</include>
                </includes>
                <fileMode>0755</fileMode> <!-- 设置文件 UNIX 属性,是一种读写权限 -->
            </fileSet>        
            <fileSet>
                <directory>src/main/resources</directory>
                <outputDirectory>conf</outputDirectory>
                <includes>
                    <include>config.properties</include>
                    <include>logback.xml</include>
                </includes>
                <fileMode>0644</fileMode>
            </fileSet>
        </fileSets>
        
    </assembly>
    

二、maven-shade-plugin

1. 插件功能

maven-plugin-shade 插件提供了两个能力:

  • 把整个项目(包含它的依赖)都打包到一个 “uber-jar” 中
  • shade - 即重命名某些依赖的包

2. uber-jar

Uber jar 的原始单词是 Über jar,是一个德语单词,可以解释为 over 或 end,但在实际上下文中,将其翻译为 everything 可能更合适。所以uber-jar也就是将所有依赖和自己的代码都放到jar文件中,便于解决大多数jar包冲突。

3. shade

shade 意为遮挡,在此处可以理解为对依赖的 jar 包的重定向(主要通过重命名的方式)。主要使用场景是解决agent jar包中的第三方jar包和目标JVM中运行的jar包间的冲突。这种方式就避免了下载第三方jar包源码,然后重构包名方便多了。

4. 使用方式

在pom文件申明shade插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
	<configuration>
    <!-- 此处按需编写更具体的配置 -->
    </configuration>
    <executions>
        <execution>
            <!-- 和 package 阶段绑定 -->
            <phase>package</phase>
            <goals>
            <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

5. configuration常用配置:

5.1选择必要的依赖或者排除不必要的依赖
<configuration>
    <filters>
        <filter>
            <artifact>junit:junit</artifact>
            <includes>
                <include>junit/framework/**</include>
                <include>org/junit/**</include>
            </includes>
            <excludes>
                <exclude>org/junit/experimental/**</exclude>
                <exclude>org/junit/runners/**</exclude>
            </excludes>
        </filter>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
</configuration>
5.2 移除项目中没有使用到的依赖
<configuration>
    <minimizeJar>true</minimizeJar>
</configuration>
5.3 重命名类文件名字
<configuration>
    <relocations>
        <relocation>
            <!--原始包名-->
            <pattern>org.codehaus.plexus.util</pattern>
            <!--重命名后的包名-->
            <shadedPattern>org.shaded.plexus.util</shadedPattern>
            <excludes>
                <!--原始包内不需要重命名的类,类名支持通配符-->
                <exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
                <exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
            </excludes>
            <includes>
                 <!--原始包类我们需要的类-->
           		 <include>org.codehaud.plexus.util.io.*</include>
        	</includes>
        </relocation>
    </relocations>
</configuration>
5.4 生成可执行jar包
<configuration>
        <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>org.sonatype.haven.HavenCli</mainClass>
            </transformer>
        </transformers>
 </configuration>
5.5 生成资源文件

默认地,shade 为我们提供了 12 个 ResourceTransformer 类:

类名 作用
ApacheLicenseResourceTransformer 防止 LICENSE 文件重复
ApacheNoticeResourceTransformer 准备合并的 NOTICE
AppendingTransformer 为某个资源文件附加内容
ComponentsXmlResourceTransformer 聚合 Plexus components.xml
DontIncludeResourceTransformer 防止包含指定的资源
GroovyResourceTransformer 合并 Apache Groovy 的扩展模块
IncludeResourceTransformer 添加项目中的文件为资源文件
ManifestResourceTransformer 自定义 MANIFEST 文件
PluginXmlResourceTransformer 聚合 Maven 的 plugin.xml 配置
ResourceBundleAppendingTransformer 合并 ResourceBundles
ServicesResourceTransformer 重定位且合并 META-INF/services 资源文件中的 class 文件.
XmlAppendingTransformer 为 XML 资源文件附加内容

上述链接中都有具体使用方法。

如果上述 12 个类都不能够满足我们的需求,我们可以实现 shade 提供的接口,按需自定义一个 ResourceTransformer,实现方法详见官网 Using your own Shader implementation

参考文献:

https://www.jianshu.com/p/3b7f386c5c4a;

https://www.jianshu.com/p/8171607ce03f;

https://www.cnblogs.com/lkxed/p/maven-plugin-shade.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。