maven assembly插件需显式配置true和才能生成可执行fat jar;它默认不写main-class、不解压依赖,必须通过assembly.xml定义归档结构并合并类文件。

Maven Assembly 插件本身不直接生成可执行 Fat Jar,它主打的是结构化、可定制的归档打包(比如把代码、依赖、脚本、配置全塞进一个 tar.gz 或 zip 里),但默认不会自动写 Main-Class 到 MANIFEST.MF,也不会重定位类(即不解决类名冲突)。所以想用它打出“双击/java -jar 就能运行”的 Fat Jar,得配合额外配置。
关键点就两个:
✅ 把所有依赖打进归档
✅ 在 MANIFEST 中声明 Main-Class 并确保 Class-Path 或内嵌逻辑生效
下面分三步说清楚怎么做:
1. 引入 assembly 插件并绑定到 package 阶段
在 pom.xml 的 <build><plugins></plugins></build> 中添加:
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-assembly-plugin</artifactid><version>3.7.1</version><!-- 推荐用最新稳定版 --><configuration><descriptor>src/main/assembly/assembly.xml</descriptor><finalname>${project.artifactId}-${project.version}</finalname><appendassemblyid>false</appendassemblyid></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>
2. 编写 assembly.xml 定义打包内容和 MANIFEST
在 src/main/assembly/assembly.xml 中,必须显式指定 <archive></archive> 并设置主类:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/ASSEMBLY/2.2.0
http://maven.apache.org/xsd/assembly-2.2.0.xsd"><id>fat-jar</id><formats><format>jar</format></formats><includebasedirectory>false</includebasedirectory><p><dependencysets><dependencyset><useprojectartifact>true</useprojectartifact><outputdirectory>.</outputdirectory><scope>runtime</scope><unpack>true</unpack><!-- 关键:解压依赖进最终 jar --></dependencyset></dependencysets></p>
<p><archive><manifest><mainclass>com.example.Main</mainclass><!-- 替换为你的真实启动类 --><addclasspath>false</addclasspath><!-- false 表示不生成 Class-Path 属性(因为已 unpack)--></manifest></archive></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="overflowclass">Alibabacloud Sdk Client Initialization For Java</a>
<p class="overflowclass">在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div></assembly>
注意:<unpack>true</unpack> 是让它真正变成 Fat Jar 的核心——把所有依赖 JAR 的 class 文件解压合并进来,而不是只放 JAR 包本身。
3. 打包并验证
执行命令:
mvn clean package
生成的文件在 target/xxx-1.0.0.jar(取决于 finalName),它就是一个标准 Fat Jar:
- 包含你项目的 class 和 resources
- 包含所有 runtime 依赖的 class(已解压合并)
- META-INF/MANIFEST.MF 里有
Main-Class: com.example.Main
直接运行即可:
java -jar target/xxx-1.0.0.jar
不复杂但容易忽略:assembly 默认不写 Main-Class,也不自动解压依赖;必须靠 <archive><manifest></manifest></archive> 和 <unpack>true</unpack> 两处手动配齐,缺一不可。










