SpringBoot 将项目打包成 Fat JAR(肥包),核心原理是利用 spring-boot-maven-plugin 插件将业务代码、所有依赖库、内嵌容器(如 Tomcat)及自定义类加载器打包成一个包含 BOOT-INF 结构的单一 JAR 文件,通过 MANIFEST.MF 指定主程序入口并以 Jar in Jar 方式运行。 打包成 JAR 的核心原理详解:
-
Fat JAR 结构 (All-in-one)
-
区别于传统 JAR 仅打包类文件,Spring Boot 打包成一个内嵌依赖的 Fat JAR。
-
JAR包目录结构主要包含:
META-INF/: 包含MANIFEST.MF文件,指明主启动类和启动类加载器。BOOT-INF/classes/: 存放应用编译后的.class文件。BOOT-INF/lib/: 存放所有第三方依赖 JAR 包。org/springframework/boot/loader/: 存放用于启动的加载器类。
-
-
Spring Boot Maven Plugin
- 该插件会在构建时介入,执行
repackage目标。 - 它会将编译完成的普通 JAR包 重新打包,将
BOOT-INF/lib下的依赖包和自己的代码合并,并将可执行逻辑嵌入其中。
- 该插件会在构建时介入,执行
-
Jar in Jar 加载机制
- 传统的 Java
java -jar命令无法直接加载 JAR 包内部的 JAR 文件。 - Spring Boot 利用自定义的
LaunchedURLClassLoader类加载器来识别并加载BOOT-INF/lib中的第三方 jar。 MANIFEST.MF文件中的Main-Class并不是业务的启动类,而是org.springframework.boot.loader.JarLauncher,它负责启动加载机制。
- 传统的 Java
-
内嵌容器支持
- 通过将 Tomcat 等 Web 容器作为依赖打包入
BOOT-INF/lib,配合上述机制,可以直接运行main方法启动服务器。
- 通过将 Tomcat 等 Web 容器作为依赖打包入
总结: Spring Boot JAR = 开发者代码 + 依赖JAR包 + 内嵌Web容器 + 自定义启动类加载器。