SpringBoot 将项目打包成 Fat JAR(肥包),核心原理

SpringBoot 将项目打包成 Fat JAR(肥包),核心原理是利用 spring-boot-maven-plugin 插件将业务代码、所有依赖库、内嵌容器(如 Tomcat)及自定义类加载器打包成一个包含 BOOT-INF 结构的单一 JAR 文件,通过 MANIFEST.MF 指定主程序入口并以 Jar in Jar 方式运行。 打包成 JAR 的核心原理详解:

  1. 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/: 存放用于启动的加载器类。
  2. Spring Boot Maven Plugin

    • 该插件会在构建时介入,执行 repackage 目标。
    • 它会将编译完成的普通 JAR包 重新打包,将 BOOT-INF/lib 下的依赖包和自己的代码合并,并将可执行逻辑嵌入其中。
  3. Jar in Jar 加载机制

    • 传统的 Java java -jar 命令无法直接加载 JAR 包内部的 JAR 文件。
    • Spring Boot 利用自定义的 LaunchedURLClassLoader 类加载器来识别并加载 BOOT-INF/lib 中的第三方 jar。
    • MANIFEST.MF 文件中的 Main-Class 并不是业务的启动类,而是 org.springframework.boot.loader.JarLauncher,它负责启动加载机制。
  4. 内嵌容器支持

    • 通过将 Tomcat 等 Web 容器作为依赖打包入 BOOT-INF/lib,配合上述机制,可以直接运行 main 方法启动服务器。

总结: Spring Boot JAR = 开发者代码 + 依赖JAR包 + 内嵌Web容器 + 自定义启动类加载器。

相关推荐
周杰伦fans1 小时前
C#对话摘要降低Token消耗
人工智能·后端·c#
做系统的大强1 小时前
脚本说 PASS、OS 读全零 —— 到底是谁在撒谎?
后端·操作系统
code2cat2 小时前
【随笔】MCP资源更新订阅:通知到达以后,Agent怎样刷新旧资料
java·后端·开发工具·ai agent·mcp
Harvil_3 小时前
任务跑一半,API 突然报“对话超长“断流:我给 Agent 修的紧急逃生通道
后端
用户EasyAdminBlazor3 小时前
EasyAdminBlazor SignalR 实时消息源码解析:从 NotificationHub 到站内消息
后端
程序猿乐锅4 小时前
【黑马点评 | 第十一篇】关注 Feed 流实现
java·数据库·redis·分布式·后端·缓存·maven
用户EasyAdminBlazor4 小时前
EasyAdminBlazor 定时任务:FreeScheduler 可视化调度与任务管理
后端
Cosolar4 小时前
云端部署阿里 Qwen-Image-2.1 保姆级教程
人工智能·后端·github
yunwei375 小时前
eBPF 开发实践:使用 sockops 加速网络请求转发
linux·后端·性能优化
看浪的路人5 小时前
第7讲:实时告警与自动化响应
开发语言·后端·golang