当前位置: 首页 > java >正文

spring-boot-maven-plugin 将spring打包成单个jar的工作原理

spring-boot-maven-plugin 是 Spring Boot 的 Maven 插件,它的核心功能是将 Spring Boot 项目打包成一个独立的、可执行的 Fat JAR(包含所有依赖的 JAR 包)。以下是它的工作原理详解:


1. 默认 Maven 打包 vs Spring Boot 插件打包

  • 标准 Maven 打包
    默认的 maven-jar-plugin 会生成一个普通的 JAR 包,仅包含项目的编译类文件(target/classes)和资源文件,不包含依赖库

  • Spring Boot 插件打包
    spring-boot-maven-plugin 会生成一个 Fat JAR,将项目的代码、资源文件以及所有依赖的第三方库(BOOT-INF/lib)和启动类加载器(org.springframework.boot.loader)打包到同一个 JAR 中,使其可以直接通过 java -jar 运行。


2. Fat JAR 的核心结构

生成的 Fat JAR 包含以下关键目录和文件:

your-app.jar
├── BOOT-INF
│ ├── classes # 项目的编译类文件(对应 src/main/java 和 src/main/resources)
│ └── lib # 所有依赖的第三方 JAR 文件
├── META-INF
│ ├── MANIFEST.MF # JAR 包的元数据(指定启动类、类路径等)
│ └── maven # Maven 构建信息
└── org
└── springframework
┣── boot
┗── loader # Spring Boot 的类加载器(JarLauncher)


3. 核心工作原理

3.1 依赖嵌入
  • 插件通过 Maven Shade Plugin 的变体,将所有依赖的 JAR 文件解压并合并到 BOOT-INF/lib 目录中。
  • 依赖库的路径会被记录在 MANIFEST.MFClass-Path 属性中。
3.2 启动类加载器
  • Spring Boot 使用自定义的类加载器 org.springframework.boot.loader.Launcher(如 JarLauncher)来启动应用。

  • MANIFEST.MF 中的关键属性

    Main-Class: org.springframework.boot.loader.JarLauncher # 启动入口
    Start-Class: com.example.YourApplication # 用户定义的 Spring Boot 主类

3.3 启动流程
  1. 执行 java -jar your-app.jar 时,JVM 根据 MANIFEST.MF 找到 JarLauncher
  2. JarLauncher 负责:
    • 加载 BOOT-INF/lib 中的依赖库。
    • 找到 Start-Class(即用户定义的 @SpringBootApplication 主类)。
    • 调用 SpringApplication.run() 启动 Spring Boot 应用。

4. 插件配置示例(pom.xml

org.springframework.boot spring-boot-maven-plugin com.example.YourApplication true org.unwanted unwanted-lib repackage

5. 关键 Maven 生命周期阶段

  • package 阶段
    Maven 默认会先调用 maven-jar-plugin 生成普通 JAR(如 your-app-0.0.1.jar)。
  • repackage 目标
    spring-boot-maven-pluginrepackage 目标会在此基础上,将普通 JAR 和依赖重新打包为 Fat JAR(如 your-app-0.0.1.jar,覆盖原文件)。

6. 高级特性

6.1 分层打包(Layered JAR)
  • 目的:优化 Docker 镜像构建(利用分层缓存)。
  • 结构
    • dependencies:第三方依赖。
    • spring-boot-loader:Spring Boot 类加载器。
    • snapshot-dependencies:快照依赖。
    • application:应用代码和资源。
6.2 排除依赖

通过 <excludes> 配置移除不需要的依赖,减少 JAR 包体积。


7. 总结

  • 核心功能:将 Spring Boot 应用及其依赖打包成一个自包含的 JAR。
  • 关键机制:自定义类加载器(JarLauncher)和嵌套依赖结构(BOOT-INF/lib)。
  • 优势:简化部署,无需外部 Web 服务器或依赖管理。
  • 适用场景:独立运行、容器化部署(Docker)等。
http://www.xdnf.cn/news/3355.html

相关文章:

  • 企业经营系统分类及功能详解
  • 华为eNSP:IS-IS认证
  • 机器人--主机--控制系统
  • Python 常用内置函数详解(九):type()函数——获取对象类型或获取一个新的类型对象
  • RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
  • 2025华东杯数学建模B题完整分析论文(共36页)(含模型、代码、数据)
  • 分享5款开源、美观的 WinForm UI 控件库
  • 【Linux网络】I/O多路转接技术 - poll
  • DAY01:Vue零基础入门:环境搭建与核心语法深度解析
  • 数据库Mysql_约束
  • 第二章 日志分析-apache日志分析(玄机系列)
  • 【论文阅读26】贝叶斯-滑坡预测-不确定性
  • 图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别
  • 基于Redis实现-用户签到
  • C++——入门基础(2)
  • podman/docker国内可用的docker镜像源(2025-05)
  • 前端八股 3
  • Linux-04-搜索查找类命令
  • WPF实现数据库操作与日志记录
  • 工行手机银行安全吗?在应用商店下载工商银行安全吗?
  • 工 厂 模 式
  • 17. LangChain流式响应与实时交互:打造“类ChatGPT“体验
  • 数字智慧方案5974丨智慧农业大数据应用平台综合解决方案(79页PPT)(文末有下载方式)
  • 数据结构与算法学习笔记(Acwing提高课)----动态规划·背包模型(二)
  • 经典算法 青蛙跳杯子
  • 【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型
  • 【MySQL】复合查询与内外连接
  • 补题( Convolution, 二维卷积求输出矩阵元素和最大值)
  • 【方案分享】基于Three.js和Stencil Buffer的AR实物遮挡方案,支持不规则动态区域(AR地下设施、AR虚实遮挡)
  • 前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制