您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot独立运行的jar包是如何工作的

时间:2022-08-03 10:01:28  来源:  作者:爱科学的卫斯理

Spring Boot使用Spring Boot Gradle Plugin或者Spring Boot Maven Plugin将程序打包成可以独立运行的jar包的。

Spring Boot使用Spring Boot Loader通过JAVA -jar来启动jar包。

我们来解压一下Spring Boot的jar包(jar其实是一个zip文件)

 

我们可以看到解压的目录下有三个子目录:BOOT-INF,META-INF,org

example.jar | +-META-INF |  +-MANIFEST.MF +-org |  +-springframework |     +-boot |        +-loader |           +-<spring boot loader classes> +-BOOT-INF    +-classes    |  +-mycompany    |     +-project    |        +-YourClasses.class    +-lib       +-dependency1.jar       +-dependency2.jar

BOOT-INF

  1. BOOT-INF/classes: 应用程序的classes文件
  2. BOOT-INF/lib: 内嵌依赖包
  3. BOOT-INF/classpath.idx: jar包添加到classpath的顺序
  4. BOOT-INF/layers.idx: 允许将 jar 拆分为逻辑层以创建Docker/OCI镜像

 

META-INF

META-INF/MANIFEST.MF: 有关jar中包含的文件的信息

 

org

Spring Boot Loader的classes

 

探索Spring Boot的魔法

我们将通过一步一步的jar包启动步骤来分析这个过程:

  • java -jar
  • 在META-INF/MANIFEST.MF文件中寻找可执行jar包的入口类:
Manifest-Version: 1.0Main-Class: org.springframework.boot.loader.JarLauncherStart-Class: top.wisely.springasync.SpringAsyncApplicationSpring-Boot-Version: 2.7.2Spring-Boot-Classes: BOOT-INF/classes/Spring-Boot-Lib: BOOT-INF/lib/Spring-Boot-Classpath-Index: BOOT-INF/classpath.idxSpring-Boot-Layers-Index: BOOT-INF/layers.idx
  • Main-Class: org.springframework.boot.loader.JarLauncher 是主入口类.
  • JarLauncher extends ExecutableArchiveLauncher 并且 ExecutableArchiveLauncher extends Launcher
  • JarLauncher 的main方法:
public class JarLauncher extends ExecutableArchiveLauncher {//... public static void main(String[] args) throws Exception {     new JarLauncher().launch(args); }//...}
  • 所以真正的 launch(args) 方法在 Launcher 类中:
public abstract class Launcher {  protected void launch(String[] args) throws Exception {     if (!isExploded()) {         JarFile.registerUrlProtocolHandler();      }     ClassLoader classLoader = createClassLoader(getClassPathArchivesIterator()); //①     String jarMode = System.getProperty("jarmode");      String launchClass = (jarMode != null && !jarMode.isEmpty()) ? JAR_MODE_LAUNCHER : getMainClass(); //②     launch(args, launchClass, classLoader);  //③ }}

① classLoader - 创建LaunchedURLClassLoader 实例. 所有的 BOOT-INF/classes 和 BOOT-INF/jar classes 都是由 LaunchedURLClassLoader 加载。

② launchClass - 从 META-INF/MANIFEST.MF 获取Start-Class。

③ 使用 args,launchClass,classLoader 启动应用。



Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
目录 1.Thymeleaf,生成PDF相关依赖 二、application.yml配置 1.PDF配置代码(如下): 1.请求接口报错解决方式: 五、生成PDF文件响应效果 温馨提示:本博客使用Thymeleaf模板引擎实...【详细内容】
2022-09-25  Tags: Spring Boot  点击:(49)  评论:(0)  加入收藏
Spring ApplicationsSpringApplication: 提供一种便携的方式来启动Spring应用(main函数)。 可以使用静态方法调用 SpringApplication.run启动启动日志 Spring启动日志默认为...【详细内容】
2022-08-23  Tags: Spring Boot  点击:(51)  评论:(0)  加入收藏
Spring Boot使用Spring Boot Gradle Plugin或者Spring Boot Maven Plugin将程序打包成可以独立运行的jar包的。Spring Boot使用Spring Boot Loader通过java -jar来启动jar包...【详细内容】
2022-08-03  Tags: Spring Boot  点击:(55)  评论:(0)  加入收藏
LogBack 默认集成在 Spring Boot 中,是基于 Slf4j 的日志框架。默认情况下 Spring Boot 是以 INFO 级别输出到控制台。它的日志级别是:ALL < TRACE < DEBUG < INFO < WARN < E...【详细内容】
2022-07-28  Tags: Spring Boot  点击:(68)  评论:(0)  加入收藏
定义注解import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Ta...【详细内容】
2022-06-29  Tags: Spring Boot  点击:(139)  评论:(0)  加入收藏
一、YAML 简介1、什么是 YAML ? YAML(YAML Ain&#39;t Markup Language),一种数据序列化格式。 这种格式的配置文件近些年逐渐进入市场,并开始占据主导地位。2、优点 较 xml 类型...【详细内容】
2022-06-22  Tags: Spring Boot  点击:(117)  评论:(0)  加入收藏
编辑推荐:本文来自于oschina,本文主要介绍了一个在 spring boot 项目添加Jeresy框架的详细过程,希望对大家能有所帮助。Jeresy是一个轻量级的JAX-RS框架添加Jeresy 2.x的依赖c...【详细内容】
2022-06-05  Tags: Spring Boot  点击:(113)  评论:(0)  加入收藏
1. 前言微信小程序开发平台,提供一类 API,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为开放接口。Tip:微信小程序开发平台,会把微信登录用户的个人信息分为明文...【详细内容】
2022-05-17  Tags: Spring Boot  点击:(172)  评论:(0)  加入收藏
一、异步执行实现方式二种:1. 使用异步注解@aysnc、启动类:添加@EnableAsync注解2. JDK 8本身有一个非常好用的Future类&mdash;&mdash;CompletableFuture@AllArgsConstructor...【详细内容】
2022-04-18  Tags: Spring Boot  点击:(93)  评论:(0)  加入收藏
作者:小兵张健链接:https://juejin.cn/post/7054441239839506446 网上很多代码都是千篇一律的 cvs,相信我只要你认真看完我写的这篇,你就可以完全掌握这个知识点,这篇文章不适合...【详细内容】
2022-04-13  Tags: Spring Boot  点击:(266)  评论:(0)  加入收藏
▌简易百科推荐
说明目前重点放在别的东西上,所以这个插件不再更新,只能用于pc端,移动端自己可以fork进行优化。Installyarn add vue-draggingHow to use普通html<script src="./vue.js"></scr...【详细内容】
2022-10-21  桥湾村的希望  今日头条  Tags:Vue   点击:(7)  评论:(0)  加入收藏
大厂技术 坚持周更 精选好文本文为来自 教育-智能学习-前端团队成员的文章,已授权 ELab 发布。智能学习前端团队自创立以来,团队专注于打破大众对教育的刻板印象,突破固有的教...【详细内容】
2022-10-14  ELab  今日头条  Tags:Tauri   点击:(11)  评论:(0)  加入收藏
根据官方的文档说明:Spring Data JPA - Reference Documentation 可以在查询的参数后面添加 True 或 False 来进行查询。例如,如果需要对下面的参数进行查询:True findByAct...【详细内容】
2022-10-11  松鼠工厂  今日头条  Tags:Spring   点击:(12)  评论:(0)  加入收藏
使用过Spring Data操作ES的小伙伴应该有所了解,它只能实现一些非常基本的数据管理工作,一旦遇到稍微复杂点的查询,基本都要依赖ES官方提供的RestHighLevelClient,Spring Data只...【详细内容】
2022-10-11  Java编程指南    Tags:MyBatis   点击:(22)  评论:(0)  加入收藏
概念IOC:控制反转。从前需要在程序中创建对象实例;现在则通过一个外部的容器统一动态创建spring IOC 容器中的实例如何动态加载Condition:只有在特定条件满足时才加载举例 @Con...【详细内容】
2022-10-10  小技术酱  今日头条  Tags:Springboot   点击:(96)  评论:(0)  加入收藏
简介在项目中,存在传递超大 json 数据的场景。直接传输超大 json 数据的话,有以下两个弊端 占用网络带宽,而有些云产品就是按照带宽来计费的,间接浪费了钱 传输数据大导致网络...【详细内容】
2022-10-10    网易号  Tags:Springboot   点击:(22)  评论:(0)  加入收藏
简介Tokio 是 Rust 世界里最著名的异步执行框架,该框架包罗了几乎所有异步执行的接口,包括但不限于文件、网络和文件系统管理。在这些方便使用的高层接口之下则是一些“基石...【详细内容】
2022-10-07  达坦科技DateLord  今日头条  Tags:Tokio   点击:(19)  评论:(0)  加入收藏
/ 前言 /我收回标题上的话,从0手撸一个框架一点也不轻松,需要考虑的地方比较多,一些实现和细节值得商榷,是一个比较大的挑战,有不足的地方欢迎大佬们提供意见/ 依赖任务加载 /平...【详细内容】
2022-10-07  Meta多元宇宙  今日头条  Tags:框架   点击:(20)  评论:(0)  加入收藏
一、全局配置自定义1、代码配置 方式一:让父子上下文ComponentScan重叠(强烈不建议使用) @Configurationpublic class StockFeignConfiguration { /** * 日志级别...【详细内容】
2022-10-07  Java架构师知识  今日头条  Tags:Spring Cloud   点击:(16)  评论:(0)  加入收藏
摘要:本文介绍了Sermant Agent的接入原理和如何使用Sermant Agent无修改接入CSE。 本文分享自华为云社区《【技术干货】Spring Cloud应用零代码修改接入华为云微服务引擎CSE-...【详细内容】
2022-10-06  华为云开发者联盟  今日头条  Tags:Spring Cloud   点击:(23)  评论:(0)  加入收藏
站内最新
站内热门
站内头条