在 maven 中使用 maven-shade-plugin 打包 fat jar,需配置插件、指定主类、排除签名文件,并用 servicesresourcetransformer 和 appendingtransformer 合并冲突资源,启用 shadedartifactattached 和 shadedclassifiername 生成 -fat.jar,最后通过 java -jar 验证运行。

在 Maven 中使用 shade 插件打包成包含所有依赖的可执行 Fat Jar,核心是配置 maven-shade-plugin 并指定主类,同时处理可能的资源冲突(比如 META-INF/MANIFEST.MF、spring.handlers 等)。
添加 shade 插件配置
在项目的 pom.xml 的 <build><plugins></plugins></build> 中加入插件声明:
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-shade-plugin</artifactid><version>3.4.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainclass>com.example.Main</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>
其中 <mainclass></mainclass> 必须替换成你实际的启动类全限定名。
解决常见资源冲突问题
多个依赖中若含同名配置文件(如 Spring 的 META-INF/spring.*、Log4j 的 log4j2.component.properties),默认会覆盖。需用 ResourcesTransformer 合并:
- 添加
ServicesResourceTransformer合并META-INF/services/文件 - 添加
AppendingTransformer合并META-INF/spring.*类型文件 - 对
META-INF/MANIFEST.MF使用ManifestResourceTransformer(已含在上例中)
示例片段:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer>
生成带 classifier 的 Fat Jar(避免覆盖普通 jar)
默认 shade 会生成一个新 jar(如 myapp-1.0-SNAPSHOT.jar),但为区分原始 jar 和胖包,建议加 <shadedartifactattached>true</shadedartifactattached> 并指定 <shadedclassifiername></shadedclassifiername>:
- 设置
<shadedclassifiername>fat</shadedclassifiername>后,生成的包名为myapp-1.0-SNAPSHOT-fat.jar - 这样
mvn clean package会同时保留原始 jar 和 fat jar - 发布或部署时明确引用
-fat.jar即可
验证与运行
打包完成后执行:
java -jar target/myapp-1.0-SNAPSHOT-fat.jar
如果报 NoClassDefFoundError 或 ClassNotFoundException,说明某些依赖未被正确包含或资源未合并;若提示 “no main manifest attribute”,检查 ManifestResourceTransformer 是否配置且 <mainclass></mainclass> 正确。
可用 jar -tf target/xxx-fat.jar | grep Main 快速确认主类是否在 jar 中,以及 MANIFEST 是否含 Main-Class 属性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











