spring boot 打包可执行 fat jar 的核心是 spring-boot-maven-plugin 的 repackage 动作,它构建含应用代码、全部依赖、嵌入式容器和 jarlauncher 的自包含结构,仅需 jdk 即可 java -jar 运行;必须在 pom.xml 的 中显式声明该插件(尤其未继承 spring-boot-starter-parent 时),且 为 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></plugins></build> 中,尤其当项目未继承 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></packaging>是jar(不是war或空) - 确保项目有且仅有一个 public static void main 方法,插件会自动识别其所在类作为启动入口(Start-Class)
执行 clean package 命令触发 repackage
运行 mvn clean package 后,插件默认执行 repackage goal,这是关键步骤。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 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 加载问题:
-
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
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










