Spring Boot 打包可执行 Fat Jar 的核心是 spring-boot-maven-plugin 的 repackage 动作,它构建含应用代码、全部依赖、嵌入式容器和 JarLauncher 的自包含结构,仅需 JDK 即可 java -jar 运行;必须在 pom.xml 的 <build><plugins> 中显式声明该插件(尤其未继承 spring-boot-starter-parent 时),且 <packaging> 为 jar,执行 mvn clean package 后生成含 BOOT-INF 和 Main-Class 的 xxx.jar 与原始 xxx.jar.original。

Spring Boot 项目打包成可直接运行的 Fat Jar,核心就是靠 spring-boot-maven-plugin 插件完成“重新封装”(repackage)动作。它不是简单把 class 打进 jar,而是构建一个自包含结构——含应用代码、全部依赖、嵌入式容器和专用启动器,只需 JDK 就能 java -jar 启动。
确认 pom.xml 正确声明插件
插件必须显式配置在 <build><plugins> 中,尤其当项目未继承 spring-boot-starter-parent(比如用了公司统一 parent)时,缺了这一步就会只生成普通 jar,无法运行。
- 基础写法(推荐,版本由 Spring Boot 父 POM 自动管理):
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 检查
<packaging>是jar(不是war或空) - 确保项目有且仅有一个 public static void main 方法,插件会自动识别其所在类作为启动入口(Start-Class)
执行 clean package 命令触发 repackage
运行 mvn clean package 后,插件默认执行 repackage goal,这是关键步骤。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- target 目录下会出现两个 jar 文件:
•xxx.jar:重打包后的 Fat Jar,含BOOT-INF/、META-INF/MANIFEST.MF(Main-Class=org.springframework.boot.loader.JarLauncher),可直接java -jar - •
xxx.jar.original:原始 jar,不含依赖和启动信息,一般不用 - 若日志中没看到
[INFO] Replacing main artifact with repackaged archive,说明 repackage 没生效,需回头检查插件配置或 parent 继承关系
理解 Fat Jar 的结构与运行机制
生成的 jar 不是传统扁平结构,而是分层设计,解决嵌套 jar 加载问题:
立即学习“Java免费学习笔记(深入)”;
-
META-INF/MANIFEST.MF:声明主启动类为org.springframework.boot.loader.JarLauncher,并指定实际应用入口类(Start-Class) -
BOOT-INF/classes/:存放编译后的业务代码和配置文件 -
BOOT-INF/lib/:所有 Maven 依赖 jar 原样存放(不解压) -
org/springframework/boot/loader/:Spring Boot 自研类加载器,能正确加载 BOOT-INF 下的嵌套资源
常见问题与避坑提示
打包后 java -jar xxx.jar 报错?多数源于以下原因:
- IDEA 点 “Build Artifacts” 生成的 jar ≠ Maven 打包结果:前者走传统逻辑,通常缺 BOOT-INF 和启动器,不能直接运行
- 使用 classifier(如
<classifier>prod</classifier>)时,文件名会变,但不影响运行;注意 IDEA Maven 工具窗口不识别 classifier,需命令行加参数触发 - JVM 参数或 Spring Profile 必须写在
-jar前,例如:java -Dspring.profiles.active=prod -Xmx512m -jar app.jar - 如果仍报
NoClassDefFoundError或 “no main manifest attribute”,用jar -tf xxx.jar | head -20查看是否有 BOOT-INF 目录,确认 MANIFEST.MF 是否存在且含 Main-Class

















