重学SpringBoot3-SpringBoot可执行JAR的原因

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-SpringBoot可执行JAR的原因

  • Spring Boot可执行JAR的结构
    • 打包运行
    • JAR 包内部结构
  • 工作原理
  • 优点
  • 总结

Spring Boot 的一个核心特性是它的可执行 JAR(通常称为“Fat JAR”或“Uber JAR”),这种 JAR 文件包含了应用程序所有的依赖库,使得应用可以通过简单的 java -jar 命令独立运行。这个特性极大地简化了部署流程,使得 Spring Boot 应用可以轻松地在各种环境中部署和运行,不再依赖特定的应用服务器。下面将介绍 Spring Boot 可执行 JAR 的工作原理和它是如何实现独立运行的。

Spring Boot可执行JAR的结构

Spring Boot 的可执行 JAR 不同于传统的 JAR 文件。传统的 JAR 文件通常只包含应用程序的类和资源文件,而所有的依赖库则需要以某种方式(如放在一个共享的类路径中)单独提供。相比之下,Spring Boot 的可执行 JAR 包含了应用程序及其所有依赖的库,还包括一个嵌入式的 Servlet 容器(如 Tomcat、Jetty 或 Undertow),以及一段特殊的启动引导代码。

打包运行

打包

命令行中输入 java -jar xxx.jar 即可运行 jar 包。

运行jar

JAR 包内部结构

内部结构

一个 Spring Boot 可执行 JAR 的内部结构大致如下:

  • META-INF/:包含了 MANIFEST.MF 等元数据文件,MANIFEST.MF 中指定了主启动类(Main-Class)和类路径(Class-path)。
    • META-INF路径
    • pom文件
  • BOOT-INF/classes/:包含了应用程序的编译后的类文件。
    • 编译后的类文件和配置文件
  • BOOT-INF/lib/:包含了应用所有依赖的第三方库。
    • 依赖的库
  • org/:包含了 Spring Boot 的启动器类。
    • 启动类

工作原理

Spring Boot 可执行 JAR 的核心是它的启动器(Launcher)。当我们执行 java -jar 命令运行 Spring Boot 应用时,JVM 实际上是加载并执行 JAR 文件中指定的启动器类。启动器类的作用包括:

  1. 设置类加载器:启动器会创建一个自定义的类加载器来加载 BOOT-INF/classes/BOOT-INF/lib/ 中的类和库。这确保了应用程序能够访问到其依赖的所有库,即使这些库并不在 JVM 的默认类路径中。
  2. 启动嵌入式Servlet容器:启动器初始化并启动嵌入式的 Servlet 容器,比如 Tomcat。这个过程中,它会将应用程序部署到容器中。
  3. 启动Spring应用上下文:最后,启动器会启动 Spring 应用上下文,完成应用程序的初始化和 Bean 的装配过程。

优点

Spring Boot 的可执行 JAR 模式带来了多个优点:

  1. 简化部署:由于应用程序和它的所有依赖都包含在一个 JAR 文件中,部署应用变得非常简单。只需将 JAR 文件传输到服务器上,然后执行 java -jar 命令即可启动应用。
  2. 独立运行:应用不再依赖外部的 Servlet 容器或应用服务器。这减少了环境差异带来的问题,提高了应用的可移植性。
  3. 快速迭代:开发过程中,可以快速打包并运行应用,加速开发和测试流程。

总结

Spring Boot 的可执行 JAR 为 Java 应用的部署和运行提供了一种简单高效的方式。通过将应用程序和其所有依赖打包到一个独立的JAR文件中,并利用启动器动态加载这些依赖,Spring Boot 应用可以轻松地在任何提供了 Java 运行时环境的系统上运行。这种模式不仅优化了部署流程,还为应用的开发、测试和生产部署提供了极大的便利。随着微服务和云原生应用的兴起,Spring Boot 的这一特性无疑提供了巨大的价值。

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

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

相关文章

leetcode热题100.柱状图中最大的矩形

Problem: 84. 柱状图中最大的矩形 文章目录 题目思路复杂度Code 题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:hei…

Flask后端框架搭建个人图库

Hello,我是"小恒不会java" 前言 最近发现自己有一些站点图片丢失,原来是用了人家的链接。考虑到使用对象存储容易被刷流量,可以用flask这种轻量级框架快速实现网页登陆操作,行,也就不考虑正式生产环境那些复…

Pytorch的hook函数

hook函数是勾子函数,用于在不改变原始模型结构的情况下,注入一些新的代码用于调试和检验模型,常见的用法有保留非叶子结点的梯度数据(Pytorch的非叶子节点的梯度数据在计算完毕之后就会被删除,访问的时候会显示为None&…

人大金仓数据库介绍与使用指南

人大金仓数据库是一款强大的关系型数据库管理系统,具有简单易用、高性能和稳定可靠的特点。本文将介绍人大金仓数据库的安装方法、常用的SQL语法以及相关工具的使用。 一、安装方法: 1、下载人大金仓数据库安装程序; 2、运行安装程序&#…

康耐视visionpro-CogFindCircleTool工具详细说明

CogFindCircleTool功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③.预期的圆弧:设置预期圆弧的中心点…

基于SSM+Jsp+Mysql的医院远程诊断系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章:软考 系统架构设计师系列知识点之云原生架构设计理论与实践(7) 所属章节: 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本,对于云原生架构的…

arp 协议

数据链路层 我们之前学习到的 IP 协议解决的是数据跨网络传输的问题。 数据链路层解决的是:直接相连的主机,进行数据交付的问题! 直接相连的设备包括我们的电脑,路由器等等哈! 我们在网络基础那篇文章中讲过什么是以…

指标监控和归因分析——数据异常波动

目录 前言 一、基于统计分析检测指标异常 二、指标异常归因分析 2.1 横向归因分析 2.2 纵向归因分析 三、智能指标波动监控&归因分析 3.1 指标看板查看 3.2 指标归因分析 前言 企业搭建完善,全面的指标体系是企业数据指导业务经营决策的第一步&#xff…

206基于matlab的无人机航迹规划(UAV track plannin)

基于matlab的无人机航迹规划(UAV track plannin)。输入输出参数包括 横滚、俯仰、航向角(单位:度);横滚速率、俯仰速率、航向角速率(单位:度/秒);飞机运动速度——X右翼、…

文件上传失败原因分析与解决

图片文件上传失败 问题描述&#xff1a;在前端开发时&#xff0c;需要通过表单元素上传图片或其他文本&#xff0c;但是上传不成功&#xff0c;后端接口也没问题 html <!--onChange用来绑定数据 handleUpload用来提交数据--><form onSubmit{handleUpload}><…

row_number 函数和关联更新

生成测试数据&#xff0c;房间号数据如下&#xff1a; CREATE TABLE hotel (floor_nbr,room_nbr) ASSELECT 1,100 FROM DUAL UNION ALLSELECT 1,100 FROM DUAL UNION ALLSELECT 2,100 FROM DUAL UNION ALLSELECT 2,100 FROM DUAL UNION ALLSELECT 3,100 FROM DUAL; 里面的房间号…