深度解析Spring Boot可执行JAR的构建与启动机制

一、Spring Boot应用打包架构演进

1.1 传统JAR包与Fat JAR对比

传统Java应用的JAR包在依赖管理上存在明显短板,依赖项需要单独配置classpath。Spring Boot创新的Fat JAR(又称Uber JAR)解决方案通过spring-boot-maven-plugin插件实现了"All-in-One"打包模式:

  • 嵌入式依赖管理:将所有第三方库打包至BOOT-INF/lib目录
  • 独立运行能力:内置启动加载器,无需外部容器
  • 统一资源管理:项目资源与依赖资源隔离存放

Fat JAR结构示意图

1.2 插件核心功能解析

在pom.xml中配置spring-boot-maven-plugin后,该插件扩展了Maven的打包能力:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version>
</plugin>

执行打包命令时:

mvn clean package

该命令触发以下处理流程:

  1. Maven标准打包生成原始JAR
  2. 插件执行repackage目标进行二次封装
  3. 生成可执行的Fat JAR(保留原始JAR为*.jar.original)

二、插件功能全景剖析

2.1 七大Goal功能矩阵

插件Goal示意图

Goal名称功能说明典型应用场景
build-image通过Buildpacks创建Docker镜像容器化部署
build-info生成build-info.properties构建信息文件CI/CD流水线集成
help显示详细帮助文档参数查询与学习
repackage重构标准JAR为可执行JAR(核心目标)生产环境打包
run直接运行Spring Boot应用本地开发调试
start/stop管理集成测试期间应用生命周期自动化测试环境管理

2.2 深度解构Fat JAR

解压可执行JAR后可见其创新目录结构:

example-app.jar
├── META-INF/
│   └── MANIFEST.MF
├── BOOT-INF/
│   ├── classes/      # 应用类文件及静态资源
│   ├── lib/          # 第三方依赖库
│   └── layers.idx    # 分层优化索引文件
└── org/└── springframework/└── boot/loader/  # Spring Boot类加载器实现

关键设计亮点:

  • 类加载隔离:自定义类加载器避免依赖冲突
  • 资源分层:优化Docker镜像构建时的分层缓存
  • 启动加速:并行加载依赖提升启动速度

三、启动加载器工作机制

3.1 MANIFEST.MF元数据解析

核心配置文件MANIFEST.MF包含以下关键属性:

Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.Application
Spring-Boot-Version: 3.1.5
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/

启动过程参数映射:

java -jar demo.jar => Main-Class↓JarLauncher.launch()↓Start-Class.main()

启动流程示意图

3.2 JarLauncher类加载机制

源码级解析启动流程:

public class JarLauncher extends ExecutableArchiveLauncher {protected void launch(String[] args) throws Exception {// 注册自定义协议处理器JarFile.registerUrlProtocolHandler();// 创建分层类加载器ClassLoader classLoader = createClassLoader(getClassPathArchivesIterator());// 获取启动配置String launchClass = getMainClass();// 反射启动应用launch(args, launchClass, classLoader);}
}

类加载器架构特点:

  • LaunchedURLClassLoader实现线程隔离加载
  • BOOT-INF/classes作为优先级最高的类路径
  • lib目录下的JAR以内存映射方式加载
  • 支持嵌套JAR的资源读取(通过!分隔符)

四、生产环境优化实践

4.1 分层打包优化

在pom.xml中配置分层策略:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layers><enabled>true</enabled></layers></configuration>
</plugin>

生成的分层索引文件layers.idx示例:

- "dependencies":- "BOOT-INF/lib/dependency1.jar"- "BOOT-INF/lib/dependency2.jar"
- "spring-boot-loader":- "org/"
- "application":- "BOOT-INF/classes/"- "BOOT-INF/libs/*.jar"

4.2 安全启动参数建议

推荐的生产环境启动配置:

java -Xms512m -Xmx1024m \-XX:MaxRAMPercentage=75.0 \-XX:+UseG1GC \-XX:MaxGCPauseMillis=200 \-Djarmode=layertools \-jar application.jar

关键参数说明:

  • MaxRAMPercentage:动态内存分配(适配容器环境)
  • jarmode=layertools:启用分层工具(用于镜像构建)
  • G1垃圾回收器:平衡吞吐量与延迟

通过深入理解Spring Boot的打包机制和启动原理,开发者可以更好地优化应用架构设计,提升部署效率,并有效排查类加载相关的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41926.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…

突破反爬困境:SDK架构设计,为什么选择独立服务模式(四)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的&#xff0c;旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…

自然语言处理,能否成为人工智能与人类语言完美交互的答案?

自然语言处理&#xff08;NLP&#xff09;作为人工智能关键领域&#xff0c;正深刻改变着人机交互模式。其发展历经从早期基于规则与统计&#xff0c;到如今借深度学习实现飞跃的历程。NLP 涵盖分词、词性标注、语义理解等多元基础任务&#xff0c;运用传统机器学习与前沿深度学…

蓝桥杯备考:八皇后问题

八皇后的意思是&#xff0c;每行只能有一个&#xff0c;每个对角线只能有一个&#xff0c;每一列只能有一个&#xff0c;我们可以dfs遍历每种情况&#xff0c;每行填一个&#xff0c;通过对角线和列的限制来进行剪枝 话不多说&#xff0c;我们来实现一下代码 #include <ios…

HDR(HDR10/ HLG),SDR

以下是HDR&#xff08;HDR10/HLG&#xff09;和SDR的详细解释&#xff1a; 1. SDR&#xff08;Standard Dynamic Range&#xff0c;标准动态范围&#xff09; • 定义&#xff1a;SDR是传统的动态范围标准&#xff0c;主要用于8位色深的视频显示&#xff0c;动态范围较窄&…

【MySQL】验证账户权限

在用户进行验证之后&#xff0c;MySQL将提出以下问题验证账户权限&#xff1a; 1.谁是当前用户&#xff1f; 2.该用户有何权限&#xff1f; 管理权限比如&#xff1a;shutdown、replication slave、load data infile。数据权限比如&#xff1a;select、insert、update、dele…

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…

GaussDB数据库表设计与性能优化实践

GaussDB分布式数据库表设计与性能优化实践 引言 在金融、电信、物联网等大数据场景下&#xff0c;GaussDB作为华为推出的高性能分布式数据库&#xff0c;凭借其创新的架构设计和智能优化能力&#xff0c;已成为企业核心业务系统的重要选择。本文深入探讨GaussDB分布式架构下的…

npm install 卡在创建项目:sill idealTree buildDeps

参考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再执行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者换梯子

【MySQL】从零开始:掌握MySQL数据库的核心概念(五)

由于我的无知&#xff0c;我对生存方式只有一个非常普通的信条&#xff1a;不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改&#xff0c;没看的同学可以过去看看&#xf…

抖音矩阵系统源码开发与部署技巧!短视频矩阵源码搭建部署

在短视频蓬勃发展的时代&#xff0c;短视频矩阵已成为内容创作者和企业扩大影响力、提升传播效果的重要策略。而一个高效、易用的前端系统对于短视频矩阵的成功运营至关重要。本文将深入探讨短视频矩阵前端源码搭建的技术细节&#xff0c;为开发者提供全面的技术指导。 一、技…

ESP32S3 WIFI 实现TCP服务器和静态IP

一、 TCP服务器代码 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an &q…

物质与空:边界中的确定性,虚无中的无限可能——跨学科视角下的存在本质探析

一、哲学框架&#xff1a;二元性与超越性 1. 物质的边界性&#xff1a;有限世界的确定性法则 在人类认知的起点&#xff0c;物质以"非0即1"的绝对姿态显现。一块石头、一滴水、乃至微观粒子&#xff0c;都以明确的边界定义自身存在。这种确定性映射着&#xff1a; 亚…

linux常用指令(10)

那么我们就继续来学习linux指令的使用,来了解搜索查找类的相关指令,话不多说,来看. 搜索查找类 1.find指令 find将从指定目录向下遍历其各个子目录,将满足条件的条件或目录显示在终端 基本语法 find[搜索范围][项项] 选项说明 -name<查询方式> 按照指定的文件名查找…

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

Leetcode 最长递增子序列的个数

java solution class Solution {public int findNumberOfLIS(int[] nums) {//边界情况处理int n nums.length;if(n < 1) return n;//然后我们创建2个数组, 分别是count数组和length数组,//length[i]的含义是以i结尾的子数组的最长递增子序列长度//count[i]的含义是以i结尾…

原型验证后客户推翻原有需求,如何止损

原型验证后客户推翻原有需求时止损的有效方法包括&#xff1a;迅速评估影响范围、立即开展沟通确认、调整项目计划和资源配置、更新变更管理流程、协商成本分担机制。其中&#xff0c;迅速评估影响范围是关键&#xff0c;项目团队必须立即明确此次变更的具体影响&#xff0c;包…

在rockylinux9.4安装mongodb报错:缺少:libcrypto.so.10文件库

问题点&#xff1a; rockylinux9.4系统环境报错&#xff1a; ./mongod: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory 解决方法&#xff1a; Ps&#xff1a;解压之后&#xff0c;检查mongodb的依赖环境…

如何应对竞品分析不足导致的方案偏差

应对竞品分析不足导致方案偏差的有效措施包括&#xff1a;深入竞品调研、建立定期竞品分析机制、明确竞品分析维度、引入专业竞品分析工具、优化内部沟通反馈机制。其中&#xff0c;深入竞品调研尤为重要。通过全面深入地分析竞争对手的产品策略、市场定位及用户反馈&#xff0…