Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SpringBoot之spring-boot-load模块

SpringBoot之spring-boot-load模块

作者头像
加多
发布于 2018-09-06 07:10:20
发布于 2018-09-06 07:10:20
1.5K00
代码可运行
举报
文章被收录于专栏:Java编程技术Java编程技术
运行总次数:0
代码可运行

一、前言

正常情况下classloader只能找到jar里面当前目录或者文件类里面的*.class文件。为了能够加载嵌套jar里面的资源之前都是把嵌套jar里面的class文件和应用的class文件打包为一个jar,这样就不存在嵌套jar了,但是这样做就不能很清晰的知道应用到底依赖了哪些东西,哪些是应用自己的,另外多个jar里面的class可能内容不一样但是文件名却一样。springboot中spring-boot-loader就是为优雅解决这个问题而诞生的。

spring-boot-loader模块允许我们使用java -jar archive.jar运行包含嵌套依赖jar的jar或者war文件,它提供了三种类启动器 (JarLauncher, WarLauncher and PropertiesLauncher),这些类启动器的目的一样都是为了能够加载嵌套在jar里面的资源(比如class文件,配置文件等)。[Jar|War]Launcher固定去查找当前jar的lib目录里面的嵌套jar文件里面的资源。

二、spring-boot-loader模块提供的jar目录结构

Springboot中jar文件格式固定如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
archive.jar
 |
 +-META-INF1|  +-MANIFEST.MF
 +-org(2|  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-com(3|  +-mycompany
 |     + project
 |        +-YouClasses.class
 +-lib(4+-dependency1.jar
    +-dependency2.jar
  • 结构(1)jar文件中MANIFEST.MF文件存放处
  • 结构(2) Spring-boot-loader本身需要的class放置处
  • 结构(3) 应用本身的文件放置处
  • 结构(4)应用依赖的jar固定放到lib目录。

那么spring-boot是如何去按照这个结构加载资源那?

  • 首先在打包时候会使用spring-boot-maven-plugin插件重写打成的jar文件,会设置META-INF/MANIFEST.MF中的 Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.mycompany.project.MyApplication 并拷贝spring-boot-loader包里面的class文件到结构(2),应用依赖拷贝到(4)应用类拷贝到(3)
  • 通过java -jar archive.jar 运行时候Launcher会去加载JarLauncher类并执行其中的main函数,JarLauncher主要关心构造一个合适的URLClassLoader加载器用来调用我们应用程序(MyApplication)的main方法。

三、spring-boot-maven-plugin插件打包流程分析

image.png

注:这里需要思考下为何要拷贝本来应该放入到lib里面的spring-boot-loader.jar里面的class到结构(2)?

四、JarLauncher执行流程分析

image.png

看完这个流程在分析下第三节留的问题,如流程图首先使用Appclassloader加载了JarLauncher类并创建了LaunchedURLClassLoader类,而LaunchedURLClassLoader是属于spring-boot-loader.jar包里面的,而Appclassloader是普通的加载器不能加载嵌套的jar里面的文件,所以如果把spring-boot-loader.jar放到lib 目录下,Appclassloader将找不到LaunchedURLClassLoader。所以在打包时候 拷贝本来应该放入到lib里面的spring-boot-loader.jar里面的class到结构(2)。

五、总结

spring-boot-load模块通过自定义jar包结构自定义类加载器优雅的实现了嵌套jar资源的加载,通过打包时候重新设置启动类和组织jar结构,通过运行时设置自定义加载器来实现嵌套jar资源加载。更多分析欢迎关注微信公众号‘技术原始积累’

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.01.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 核心模块原理剖析
微服务始终一个相对热门的话题,SpringBoot 则以其轻量级、内嵌 Web 容器、一键启动、方便调试等特点被越来越多的微服务实践者所采用。 知其然还要知其所以然,你了解 SpringBoot 中三大核心模块的实现原理吗? 三大核心模块 spring-boot-load 模块 正常情况下一个类加载器只能找到加载路径的 jar 包里当前目录或者文件类里面的 *.class 文件,SpringBoot 允许我们使用 java -jar archive.jar 运行包含嵌套依赖 jar 的 jar 或者 war
CSDN技术头条
2018/04/18
1.5K0
SpringBoot模块组成
1.1、 spring-boot模块 该模块提供了一些特性用来支持springboot中其他模块,这些特性包含如下。 SpringApplication类提供了静态方法以便于写一个独立了spring应用程序,该类的主要职责是create和refresh一个合适的Spring 应用程序上下文(ApplicationContext) 给web应用提供了一个可选的web容器(目前有Tomcat或Jetty) 一流的外部配置的支持(application.properties) 提供了便捷的应用程序上下文(Appl
企鹅号小编
2018/02/02
7090
SpringBoot模块组成
Spring boot 项目打出来的包启动过程
spring boot 的工程支持打包为jar和war,打包成 jar 或 war 可以直接用 java -jar xxx.jar 来启动,war包也可以放入tomcat等容器中运行。
前Thoughtworks-杨焱
2021/12/07
1.7K0
Spring boot 项目打出来的包启动过程
硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!
Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin,可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。
芋道源码
2020/06/05
2K0
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
大家开发的基于Spring Boot 的应用 ,jar形式, 发布的时候,绝大部分都是使用java -jar 启动。 得益于Spring Boot 的封装 , 再也不用操心搭建tomcat等相关web容器le , 一切变得非常美好, 那SpringBoot是怎么做到的呢?
小小工匠
2021/08/17
1.5K0
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
为什么SpringBoot的 jar 可以直接运行?
SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可:
JAVA葵花宝典
2020/04/23
1.2K0
SpringBoot系列-- jar可执行原理
文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看。
田维常
2020/02/13
9410
Spring Boot -- 如何获取已加载的JAR文件流
最近遇到一个需求,在程序运行期间,拿到已加载类对应的jar包,然后上传到另一个地方,本以为利用ClassLoader直接定位到jar的InputStream流直接读取就ok,事实却没有这么简单,我把问题总结为以下几个小点,逐一解决。
屈定
2020/02/10
5.6K1
spring boot应用启动原理分析
摘要: spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server。
Java架构师历程
2018/09/26
1.9K0
SpringBoot从0到实战5:项目是如何通过jar包启动的?
仔细观察发现Start-Class指向的是我们的启动类HelloStsApplication,也就是注解了@SpringBootApplication的类。而Main-Class则可以理解为真正的启动类。
程序员洲洲
2024/06/06
1620
SpringBoot从0到实战5:项目是如何通过jar包启动的?
springboot如何加载应用程序
上篇《ClassLoader#getResource与Class#getResource的差别》[1]了解原生java获取资源方式以及方式之间的区别。
码农戏码
2022/11/18
1.1K0
springboot如何加载应用程序
SpringBoot的启动引导类真的是XXApplication吗?
SpringBoot项目中的启动类,一般都是XXApplication,例如StatsApplication,UnionApplication。每个项目的启动类名称都不一样。但是它的启动类真的是XXApplication吗?
温安适
2020/06/07
1.3K0
SpringBoot项目jar、war包启动解析
war包启动:需要先启动外部的Web服务器,实现Servlet3.0规范中引导应用启动类,然后将war包放入Web服务器下,Web服务器通过回调引导应用启动类方法启动应用。
阿珍
2023/03/20
2K0
你的springboot starter是如何生效的?
一、背景描述二、自定义starter实现方式三、自定义starter依赖加载原理四、spring.factories加载与解析五、参考
叔牙
2023/08/09
6050
你的springboot starter是如何生效的?
springboot的jar为何能独立运行
在开发springboot应用时,通过java -jar命令启动应用是常用的方式,今天就来一起了解这个简单操作背后的技术;
程序员欣宸
2021/05/13
7690
springboot的jar为何能独立运行
SpringBoot 系列-FatJar 启动原理
小伙伴们,大家好!从今天开始,我将持续更新磊叔的SpringBoot 系列文章,还请大家多多关注,多多转发,为我们开发者圈多分享些干货,在此谢过各位了!
安徽开发者圈
2020/03/02
1.8K0
SpringBoot打包部署解析:Launcher实现原理
Launcher实现原理 在上节内容中,我们得知 jar 包 Main-Class 指定入口程序为 Spring Boot 提供的 L auncher(JarL auncher),并不是我们在 Sp
愿天堂没有BUG
2022/10/28
1K0
SpringBoot打包部署解析:Launcher实现原理
可运行jar包的几种打包/部署方式
java项目开发中,最终生成的jar,大概可分为二类,一类是一些通用的工具类(不包含main入口方法),另一类是可直接运行的jar包(有main入口方法),下面主要讲的是后者,要让一个jar文件可直接运行,通常有几下三种方式:
菩提树下的杨过
2018/09/20
2.3K0
可运行jar包的几种打包/部署方式
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
通过启动参数loader.path配置外置依赖包的加载路径。 项目成功启动,说明我们配置的外包依赖包加载生效了
小小工匠
2023/11/26
8250
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
Spring Boot 核心编程思想-第一部分-读书笔记「建议收藏」
本文是Spring Boot核心编程思想记录的笔记,书籍地址:Spring Boot编程思想(核心篇):
全栈程序员站长
2022/07/20
9560
Spring Boot 核心编程思想-第一部分-读书笔记「建议收藏」
推荐阅读
相关推荐
SpringBoot 核心模块原理剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文