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;
- 点赞
- 收藏
- 关注作者
评论(0)