Maven Assembly插件需显式配置<unpack>true</unpack>和<manifest><mainClass>才能生成可执行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> 中添加:
<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> 并设置主类:
<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>
</assembly>注意:<unpack>true</unpack> 是让它真正变成 Fat Jar 的核心——把所有依赖 JAR 的 class 文件解压合并进来,而不是只放 JAR 包本身。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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> 和 <unpack>true</unpack> 两处手动配齐,缺一不可。

















