提示:比 jar-maven-assembly-plugin 使用更广泛
说明
maven-shade-plugin 插件,用来打可执行包,即:executable jar 或 fat jar,将项目依赖的jar包解压并融合到自身 jar包 中
配置
在 pom.xml 中添加下面代码:
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass><!-- 指定主类 -->
</transformer>
</transformers>
<filters>
<filter>
<!-- 排除全部签名文件 -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
为什么排除全部签名文件
多个依赖 jar 包里自带的签名文件(*.SF / *.DSA / *.RSA)默认打进 fatjar。
当 JDK 加载 jar 时,会校验签名摘要,但是 shade 已经把所有 class 合并重写,签名和实际文件对不上,直接抛出安全异常,也就是下面 JNI 报错弹窗:


打包
执行 mvn package 打包
结果
在 target 目录下 会生成 2-3 个jar包:
- artifactId_version.jar,把依赖打入到包中
- artifactId_version-shaded.jar,把依赖打入到包中,如果设置 依赖包进行重命名,就在该包中
- original-artifactId_version.jar,没有把依赖打入到包中,就是将本工程打成jar包
其他配置
给jar命名
在 <build> 下添加 <finalName> 标签:
<build>
<!-- 用artifactId作为jar包名 -->
<finalName>${artifactId}</finalName>
</build>
参考:
https://www.jianshu.com/p/3b7f386c5c4a