深度解析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.mzph.cn/bicheng/74720.shtml

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

相关文章

安科瑞微电网能量管理控制箱,光伏发电的守护者

安科瑞顾强 随着工业的发展&#xff0c;很多用电设备和工厂设备采用直流系统供电&#xff0c;直流系统的正极和负极不接地。对于不接地&#xff08;IT&#xff09;配电系统&#xff0c;应该进行绝缘电阻的监控以保证供电系统的安全运行。 AIM-D100-TS 系列直流绝缘监测仪可以…

[计算机网络]网络I/O模型

欢迎来到啾啾的博客&#x1f431;。 这是一个致力于构建完善的Java程序员知识体系的博客&#x1f4da;&#xff0c;记录学习的点滴&#xff0c;分享工作的思考、实用的技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。…

Vue中使用JsonView进行JSON数据展示

前言 最近在开发公司的管理系统的操作日志模块&#xff0c;要查看某条操作日志的请求参数&#xff0c;要将请求的参数以 JSON 格式的形式展示出来&#xff0c;于是用到了Vue-JSON-Viewer 这个插件。 一、Vue-JSON-Viewer 基础入门 插件简介 Vue-JSON-Viewer 是一个用于在Vue项…

vue vue3 走马灯Carousel

背景&#xff1a; 在项目中需要展示多张图片&#xff0c;但在页面上只有一张图片的有限位置&#xff0c;此时考虑使用轮播图实现多张图片的展示。element组件官网有走马灯Carousel的组件详细介绍。 实现效果&#xff1a; 官网链接&#xff1a;点击跳转 核心代码&#xff1a; …

重学vue3(三):vue3基本语法及使用

组合式 API是vue3 的核心特性&#xff0c;替代 Vue2 的选项式 API&#xff0c;强调逻辑复用和代码组织。基本语法如下&#xff1a; <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 响应式数据 const count ref(0); // 基本类…

Spring Boot分布式项目异常处理实战:从崩溃边缘到优雅恢复

当单体应用拆分成分布式系统&#xff0c;异常就像被打开的潘多拉魔盒&#xff1a;RPC调用超时、分布式事务雪崩、第三方接口突然罢工…在最近的电商大促中&#xff0c;我们的系统就经历了这样的至暗时刻。本文将用真实代码示例&#xff0c;展示如何构建分布式异常处理体系。 一…

导出sql命令

除了之前提到的 \G 命令&#xff0c;以下是其他优化 MySQL 查询结果显示的方法&#xff0c;供你参考&#xff1a; --- ### 1. **使用 \T 命令导出结果到文件** - 在 MySQL 命令行中&#xff0c;使用 \T 文件名 可以将查询结果以表格形式导出到指定文件&#xff0c;便于后续…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

深度解析 BPaaS:架构、原则与研发模式探索

在当今复杂多变的业务环境下&#xff0c;软件开发面临着诸多挑战&#xff0c;如何有效地管理业务复杂性并实现系统的可扩展性成为关键。BPaaS应运而生&#xff0c;它作为一种创新的理念和架构模式&#xff0c;改变着企业研发的方式。本文将深入探讨 BPaaS 是什么&#xff0c;以…

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…

操作系统导论——第13章 抽象:地址空间

一、早期系统 从内存来看&#xff0c;早期的机器并没有提供多少抽象给用户。基本上&#xff0c;机器的物理内存如图13.1所示 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&…

云端存储新纪元:SAN架构驱动的智能网盘解决方案

一、企业存储的"不可能三角"破局 1.1 传统存储架构的困局 性能瓶颈&#xff1a;NAS架构在1000并发访问时延迟飙升300%容量限制&#xff1a;传统RAID扩容需停机维护&#xff0c;PB级存储扩展耗时超48小时成本矛盾&#xff1a;全闪存阵列每TB成本高达$3000&#xff0…

Android adb自身调试log开关

本文介绍下如何打开adb源码中的debug log 1.adb源码log是可以动态打开和关闭的&#xff0c;控制逻辑代码如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…

Axure RP 9.0教程: 基于动态面板的元件跟随来实现【音量滑块】

文章目录 引言I 音量滑块的实现步骤添加底层边框添加覆盖层基于覆盖层创建动态面板添加滑块按钮设置滑块拖动效果引言 音量滑块在播放器类APP应用场景相对较广,例如调节视频的亮度、声音等等。 I 音量滑块的实现步骤 添加底层边框 在画布中添加一个矩形框:500 x 32,圆…

rocky linux 与centos系统的区别

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的社区发行版&#xff0c;但两者在目标定位、更新策略和社区管理上有显著差异。以下是核心区别的详细对比&#xff1a; 一、背景与定位 特性Rocky LinuxCentOS起源由 CentOS 联合创始人…

洛谷题单1-B2002 Hello,World!-python-流程图重构

题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 无输出 #1 Hello,World!方式-print() 代码 class Solut…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机&#xff08;链路层&#xff09;mac地址表的数据转发路由器&#xff08;网络层&#xff09; ip路由表的数据转发 隔离广播域…

爱普生SG-3031CMA有源晶振在汽车雷达中的应用

随着自动驾驶技术的普及&#xff0c;汽车雷达已成为高级驾驶辅助系统&#xff08;ADAS&#xff09;和自动驾驶系统的核心感知组件。雷达模块需要精确的时钟信号来确保发射/接收时序的准确性、信号处理的同步性以及低功耗运行。这些系统对时钟信号的稳定性、抗干扰性及环境适应性…

案例实践 | 招商局集团以长安链构建“基于DID的航运贸易数据资产目录链”

概览 案例名称 基于DID的航运贸易数据资产目录链 业主单位 招商局集团 上线时间 2024年10月 用户群体 供数用数企业和个人 用户规模 集团内20企业 案例背景 招商局集团深入落实“促进数据高效流通使用、赋能实体经济”精神&#xff0c;深化集团数字化水平&#xff0c…

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…