温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring-boot-load模块在Spring Boot中的作用是什么

发布时间:2021-01-13 16:49:26 来源:亿速云 阅读:484 作者:Leah 栏目:编程语言

本篇文章为大家展示了spring-boot-load模块在Spring Boot中的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、前言

正常情况下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文件格式固定如下:

archive.jar
 |
 +-META-INF(1)
 | +-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插件打包流程分析

spring-boot-load模块在Spring Boot中的作用是什么 

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

四、JarLauncher执行流程分析

spring-boot-load模块在Spring Boot中的作用是什么 

看完这个流程在分析下第三节留的问题,如流程图首先使用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模块在Spring Boot中的作用是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI