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

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)等。

相关文章:

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

spring-boot-maven-plugin 是 Spring Boot 的 Maven 插件&#xff0c;它的核心功能是将 Spring Boot 项目打包成一个独立的、可执行的 Fat JAR&#xff08;包含所有依赖的 JAR 包&#xff09;。以下是它的工作原理详解&#xff1a; 1. 默认 Maven 打包 vs Spring Boot 插件打包…...

盐化行业数字化转型规划详细方案(124页PPT)(文末有下载方式)

资料解读&#xff1a;《盐化行业数字化转型规划详细解决方案》 详细资料请看本解读文章的最后内容。 该文档聚焦盐化行业数字化转型&#xff0c;全面阐述了盐化企业信息化建设的规划方案&#xff0c;涵盖战略、架构、实施计划、风险及效益等多个方面&#xff0c;旨在通过数字化…...

开源革命:从技术共享到产业变革——卓伊凡的开源实践与思考-优雅草卓伊凡

开源革命&#xff1a;从技术共享到产业变革——卓伊凡的开源实践与思考-优雅草卓伊凡 一、开源的本质与行业意义 1.1 开源软件的定义与内涵 当卓伊凡被问及”软件开源是什么”时&#xff0c;他给出了一个生动的比喻&#xff1a;”开源就像将食谱公之于众的面包师&#xff0c…...

解锁 C++26 的未来:从语言标准演进到实战突破

一、C26 的战略定位与开发进展 C26 的开发已进入功能冻结阶段&#xff0c;预计 2026 年正式发布。作为 C 标准委员会三年一迭代的重要版本&#xff0c;其核心改进聚焦于并发与并行性的深度优化&#xff0c;同时在内存管理、元编程等领域实现重大突破。根据 ISO C 委员会主席 H…...

terraform实现本地加密与解密

在 Terraform 中实现本地加密与解密&#xff08;不依赖云服务&#xff09;&#xff0c;可以通过 OpenSSL 或 GPG 等本地加密工具配合 External Provider 实现。以下是完整的安全实现方案&#xff1a; 一、基础架构设计 # 文件结构 . ├── secrets │ ├── encrypt.sh …...

黄雀在后:外卖大战新变局,淘宝+饿了么开启电商大零售时代

当所有人以为美团和京东的“口水战”硝烟渐散&#xff0c;外卖大战告一段落时&#xff0c;“螳螂捕蝉&#xff0c;黄雀在后”&#xff0c;淘宝闪购联合饿了么“闪现”外卖战场&#xff0c;外卖烽火再度燃起。 4 月30日&#xff0c;淘宝天猫旗下即时零售业务“小时达”正式升级…...

基本功能学习

一.enum枚举使用 E_SENSOR_REQ_NONE 的定义及用途 在传感器驱动开发或者电源管理模块中&#xff0c;E_SENSOR_REQ_NONE通常被用来表示一种特殊的状态或请求模式。这种状态可能用于指示当前没有活动的传感器请求&#xff0c;或者是默认初始化状态下的一种占位符。 可能的定义…...

59常用控件_QComboBox的使用

目录 代码示例:使用下拉框模拟麦当劳点餐 代码示例&#xff1a;从文件中加载下拉框的选项 QComboBox表示下拉框 核心属性 属性说明currentText当前选中的文本currentIndex当前选中的条目下标。 从 0 开始计算。如果当前没有条目被选中&#xff0c;值为 -1editable是否允许修改…...

卡洛诗西餐的文化破圈之路

在餐饮市场的版图上&#xff0c;西餐曾长期被贴上“高端”“舶来品”“纪念日专属”的标签&#xff0c;直到卡洛诗以高性价比西餐的定位破局&#xff0c;将意大利风情与家庭餐桌无缝衔接。这场从异国符号到家常选择的转型&#xff0c;不仅是商业模式的创新&#xff0c;更是一部…...

Python-57:Base32编码和解码问题

问题描述 你需要实现一个 Base32 的编码和解码函数。 相比于 Base32&#xff0c;你可能更熟悉 Base64&#xff0c;Base64 是非常常见的用字符串形式表示二进制数据的方式&#xff0c;在邮件附件、Web 中的图片中都有广泛的应用。 Base32 是 Base64 的变种&#xff0c;与 Bas…...

【排序算法】八大经典排序算法详解

一、直接选择排序&#xff08;Selection Sort&#xff09;算法思想算法步骤特性分析 二、堆排序&#xff08;Heap Sort&#xff09;算法思想关键步骤特性分析 三、直接插入排序&#xff08;Insertion Sort&#xff09;算法思想算法步骤特性分析 四、希尔排序&#xff08;Shell …...

近端策略优化PPO详解:python从零实现

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

C# System.Text.Json终极指南(十):从基础到高性能序列化实战

一、JSON序列化革命:System.Text.Json的架构优势 1.1 核心组件解析 1.2 性能基准测试(.NET 8) 操作Newtonsoft.JsonSystem.Text.Json性能提升简单对象序列化1,200 ns450 ns2.7x大型对象反序列化15 ms5.2 ms2.9x内存分配(1k次操作)45 MB12 MB3.75x二、基础序列化操作精解 …...

Centos7.9 安装mysql5.7

1.配置镜像&#xff08;7.9的镜像过期了&#xff09; 2.备份原有的 CentOS 基础源配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 3.更换为国内镜像源 sudo vi /etc/yum.repos.d/CentOS-Base.repo 将文件内容替换为以下内容&am…...

Qt指南针

Qt写的指南针demo. 运行结果 滑动调整指针角度 实现代码 h文件 #ifndef COMPASS_H #define COMPASS_H#include <QWidget> #include <QColor>class Compass : public QWidget {Q_OBJECT// 可自定义属性Q_PROPERTY(QColor backgroundColor READ backgroundColor WRI…...

杜邦分析法

杜邦分析法(DuPont Analysis)是一种用于分析企业财务状况和经营绩效的综合分析方法,由美国杜邦公司在20世纪20年代率先采用,故得名。以下是其相关内容介绍: 核心指标与分解 净资产收益率(ROE):杜邦分析法的核心指标,反映股东权益的收益水平,用以衡量公司运用自有资本…...

给U盘加上图标

电脑插入U盘后&#xff0c;U盘的那个标志没有特色&#xff0c;我们可以换成有意义的照片作为U盘图标&#xff0c;插上U盘就能看到&#xff0c;多么地浪漫。那该如何设置呢&#xff1f;一起来看看吧 选择一张ICO格式的图片到U盘里 PNG转ICO - 在线转换图标文件PNG转ICO - 免费…...

人工智能对未来工作的影响

人工智能对未来工作的影响是多方面的&#xff0c;既包括对就业结构的改变&#xff0c;也涉及工作方式、职业技能需求以及社会政策的调整。以下是对人工智能对未来工作影响的详细分析&#xff1a; 一、就业结构的变革 岗位替代与消失 人工智能技术在许多领域展现出强大的自动化…...

RocketMQ常见面试题一

1. RocketMQ 是什么?它的核心组件有哪些? 答:RocketMQ 是阿里巴巴开源的一款分布式消息中间件,支持高吞吐、低延迟、高可用的消息发布与订阅。 核心组件: NameServer:轻量级注册中心,管理 Broker 的元数据(路由信息),无状态。 Broker:消息存储和转发节点,分为 Mas…...

C++调试(壹):初步认识WinDbg和dump文件

目录 1.前言 2.WinDbg是什么&#xff1f; 3.​WinDbg安装 4.Dump文件是什么&#xff1f; ​ 5.生成Dump文件的场景 前言 这是一个关于C调试的博客&#xff0c;该系列博客主要是讲解如何使用WinDbg工具结合dump文件调试程序。在日常开发过程中&#xff0c;我们往往无法完…...

centos7 离线安装python3 保留python2

一、事前准备&#xff1a; &#xff08;1&#xff09;查看centos具体版本 cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core) &#xff08;2&#xff09;查看linux中当前python版本 centos7 默认安装python2.7.5 &#xff08;3&#xff09;查看python3的依赖&#…...

【dify—9】Chatflow实战——博客文章生成器

目录 一、创建Chatflow 二、创建变量 三、添加时间工具 四、编写提示词 五、回复输出 六、运行 第一部分 安装difydocker教程&#xff1a;【difydocker安装教程】-CSDN博客 第二部分 dock重装教程&#xff1a;【dify—2】docker重装-CSDN博客 第三部分 dify拉取镜像&…...

华为OD机试真题——斗地主之顺子(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式&#xff1b; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析&#xff1b; 本文收录于专栏&#xff1a;《2025华为OD真题目录…...

3.2/Q2,Charls最新文章解读

文章题目&#xff1a;Internet usage elevates elderly obesity: evidence from a difference-in-differences analysis of the broadband China policy DOI&#xff1a;10.1186/s13690-025-01565-9 中文标题&#xff1a;互联网使用导致老年人肥胖&#xff1a;中国宽带政策差异…...

Seata服务端开启事务核心源码解析

文章目录 概述一、doGlobalBegin1.1、createGlobalSession1.2、addSessionLifecycleListener1.3、begin 概述 Seata服务端作为TC角色&#xff0c;用于接收客户端标注了GlobalTransactional也就是TM角色的开启事务&#xff0c;提交/回滚事务请求&#xff0c;维护全局和分支事务的…...

Seata服务端回滚事务核心源码解析

文章目录 前言一、doGlobalRollback3.1、changeGlobalStatus3.2、doGlobalRollback 前言 本篇介绍Seata服务端接收到客户端TM回滚请求&#xff0c;进行处理并且驱动所有的RM进行回滚的源码。 一、doGlobalRollback doGlobalRollback是全局回滚的方法&#xff1a;   首先依旧…...

PMP-第九章 项目资源管理(一)

项目资源管理概述 项目资源管理包括识别、获取和管理所需资源以完成项目的各个过程资源主要分为实物资源和人力资源&#xff1b;实物资源包括设备、材料和基础设施等团队资源或人员指的是人力资源团队资源管理与项目干系人管理有重叠的部分&#xff0c;本章重点关注组成项目团…...

【Unity】MVP框架的使用例子

在提到MVP之前&#xff0c;可以先看看这篇MVC的帖子&#xff1a; 【Unity】MVC的简单分享以及一个在UI中使用的例子 MVC的不足之处&#xff1a; 在MVC的使用中&#xff0c;会发现View层直接调用了Model层的引用&#xff0c;即这两个层之间存在着一定的耦合性&#xff0c;而MV…...

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟

Matlab/Simulink - BLDC直流无刷电机仿真基础教程&#xff08;四&#xff09; - PWM调制模拟 前言一、PWM调制技术基本原理二、仿真模型中加入PWM调制三、逆变电路MOS管添加体二极管四、模拟添加机械负载五、仿真模型与控制框图文章相关模型文件下载链接参考链接 前言 本系列文…...

x86架构详解:定义、应用及特点

一、x86架构的定义 x86 是由Intel公司开发的复杂指令集&#xff08;CISC&#xff09;处理器架构&#xff0c;起源于1978年的Intel 8086处理器&#xff0c;后续扩展至32位&#xff08;IA-32&#xff09;和64位&#xff08;x86-64&#xff09;。其名称来源于早期处理器型号的“8…...

C++学习-入门到精通-【3】控制语句、赋值、自增和自减运算符

C学习-入门到精通-【3】控制语句、赋值、自增和自减运算符 控制语句、赋值、自增和自减运算符 C学习-入门到精通-【3】控制语句、赋值、自增和自减运算符一、什么是算法二、伪代码三、控制结构顺序结构选择结构if语句if...else语句switch语句 循环结构while语句 四、算法详述&a…...

【Bootstrap V4系列】学习入门教程之 页面内容排版

Bootstrap V4 学习入门教程之 页面内容排版 按钮上的指针排版一、Global settings 全局设置二、Headings 标题2.1 Customizing headings 自定义标题2.2 Display headings 显示标题2.3 Lead 引导 三、Blockquotes 块引用3.1 Naming a source 命名源3.2 Alignment 对齐 四、Lists…...

GTA5(传承/增强) 13980+真车 超跑 大型载具MOD整合包+最新GTA6大型地图MOD 5月最新更新

1500超跑载具 1000普通超跑 1500真车超跑 各种军载具1000 各种普通跑车 船舶 飞机 1000 人物1500 添加式led载具1000 超级英雄最新版 添加添加式武器MOD1000 添加地图MOD500 添加超跑载具2000 当前共计1.2wMOD 4月2日更新 新增770menyoo地图 当前共计12770 新增48款超级英雄最新…...

目标文件的段结构及核心组件详解

目标文件&#xff08;如 .o 或 .obj&#xff09;是编译器生成的中间文件&#xff0c;其结构遵循 ELF&#xff08;Linux&#xff09;或 COFF&#xff08;Windows&#xff09;格式。以下是其核心段&#xff08;Section&#xff09;和关键机制的详细解析&#xff1a; 1. 目标文件的…...

60常用控件_QSpinBox的使用

目录 代码示例&#xff1a;调整麦当劳购物车中的份数 使⽤ QSpinBox 或者 QDoubleSpinBox 表⽰ "微调框", 它是带有按钮的输⼊框. 可以⽤来输⼊整 数/浮点数. 通过点击按钮来修改数值⼤⼩. 由于 SpinBox 和 QDoubleSpinBox ⽤法基本相同, 就只介绍 SpinBox 的…...

数据库Mysql_约束

将失败当作自己的老师&#xff0c;即使他会使自己难堪 ----------陳長生. 1.什么是数据库约束 数据库约束是在数据库中对表中的内容设定条件或者规则&#xff0c;设置了这些规则能使得数据更具体有准确性&#xff0c;可靠性。 2.约束类型 NOT NULL设置列不能为空UNIQUE设置列…...

C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)

一.派生类的默认成员函数 1.14个常见默认成员函数 默认成员函数&#xff0c;默认的意思就是指我们不写&#xff0c;编译器会自动为我们生成一个&#xff0c;那么在派生类中&#xff0c;这几个成员函数是如何生成的呢&#xff1f; 1.派生类的构造函数必须调用基类的构造函数初…...

DeepSeek V3 训练策略:FP8混合精度与多Token预测

近年来,大规模语言模型取得重大突破,但其训练与部署成本也随之攀升。DeepSeek 系列开源模型致力于通过优化模型结构和训练策略来降低成本、提升性能。DeepSeek V3 融合了多种先进技术(如 FP8 低精度训练、DualPipe 双流水线机制、多Token 预测目标等),在保证模型能力的同时…...

开始一个vue项目

一、创建vite项目和配置 1、查看npm版本&#xff1a; npm --version 根据版本选择创建命令 # npm 6.x npm create vitelatest my-vue-product --template vue # npm 7 npm create vitelatest my-vue-product -- --template vue 2、依次执行&#xff1a; npm install n…...

世纪华通:从财报数据看其在游戏领域的成功与未来

引言 日前&#xff0c;世纪华通发布了2024年及2025年第一季度的财务报告。报告显示&#xff0c;公司不仅在过去一年取得了显著的营收增长&#xff0c;而且在国内外市场均有出色表现。特别是《无尽冬日》和《Whiteout Survival》等游戏的成功&#xff0c;为世纪华通带来了巨大的…...

ruoyi-plus Spring Boot + MyBatis 中 BaseEntity 的设计与动态查询实践

一、BaseEntity 设计解析 以下是一个典型的 BaseEntity 设计示例: @Data public class BaseEntity implements Serializable {@Serialprivate static final long serialVersionUID =...

MCP:智能家居的“大脑”,如何引领未来居住革命

MCP:智能家居的“大脑”,如何引领未来居住革命 一、引言:MCP与智能家居的未来 随着智能家居的迅猛发展,越来越多的家庭开始拥有各种智能设备,从智能灯泡、智能门锁到智能音响,每一个设备都在为生活提供便利与舒适。然而,尽管这些设备各自具备了独立的功能,但它们之间往…...

[基础]详解C++模板类(完整实例代码)

目录 C模板类&#xff1a;通用编程的基石引言一、模板类的核心作用1.1 代码复用1.2 类型安全1.3 性能优化 二、模板类的进阶用法2.1 多参数模板2.2 非类型参数2.3 成员函数特化 三、实战场景解析3.1 场景一&#xff1a;通用容器开发3.2 场景二&#xff1a;算法抽象3.3 场景三&a…...

Python 常用内置函数详解(九):type()函数——获取对象类型或获取一个新的类型对象

目录 一、功能二、语法和示例 一、功能 type() 函数有两种形式&#xff0c;当只有一个参数时&#xff0c;用于获取对象的类型&#xff1b;当有多个参数时&#xff0c;用于获取新的类型对象。 二、语法和示例 第一种&#xff1a; type(object)参数说明: 1.object: 对象 2.…...

FreeRTOS任务管理与通信机制详解

1 任务的创建与管理 任务创建 使用 xTaskCreate() 创建任务&#xff1a; BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 任务函数&#xff08;入口&#xff09; const char * const pcName, // 任务名称&#xff08;调试用&#xff09; config…...

哈希表笔记(二)redis

Redis哈希表实现分析 这份代码是Redis核心数据结构之一的字典(dict)实现&#xff0c;本质上是一个哈希表的实现。Redis的字典结构被广泛用于各种内部数据结构&#xff0c;包括Redis数据库本身和哈希键类型。 核心特点 双表设计&#xff1a;每个字典包含两个哈希表&#xff0…...

专题二十一:无线局域网——WLAN

一、WLAN简介 WLAN&#xff08;Wireless Local Area Network &#xff09;无线局域网&#xff0c;使用的是 IEEE 802.11 标准系列。 标准版本发布年份最大传输速率频段Wi-Fi代数特点/描述IEEE 802.1119971–2 Mbps2.4 GHzWi-Fi 0最早的无线局域网标准&#xff0c;传输速率低&…...

例数据中关键指标对应的SQL查询模板

以下是针对示例数据中关键指标对应的SQL查询模板&#xff0c;包含MySQL和PostgreSQL两种版本&#xff1a; 1. 订单处理系统指标查询 1.1 订单处理成功率 -- MySQL SELECT DATE_FORMAT(created_at, %Y-%m-%d %H:%i:00) AS time_window,COUNT(*) AS total_orders,SUM(CASE WHE…...

【业务领域】电脑主板芯片电路结构

前言 由前几期视频合集(零基础自学计算机故障排除—7天了解计算机开机过程)&#xff0c;讲解了POST的主板软启动过程&#xff1b;有不少网友留言、私信来问各种不开机的故障&#xff0c;但大多网友没能能过我们的这合集视频&#xff0c;很好的理清思路&#xff0c;那这样的情况…...

利用无事务方式插入数据库解决并发插入问题

一、背景 由于项目中同一个网元&#xff0c;可能会被多个不同用户操作&#xff0c;而且操作大部分都是以异步子任务形式进行执行&#xff0c;这样就会带来并发写数据问题&#xff0c;本文通过利用无事务方式插入数据库解决并发插入问题&#xff0c;算是解决问题的一种思路&…...