maven springboot 除去指定的jar包_SpringBoot的运行机制

SpringBoot打包机制

先看一眼spring-boot的maven插件打包后的target目录:

2c77053ba9fb4ebef732a081416c1dda.png

其中有一个.jar.original的文件,一个.jar文件,其中.jar.original才是原始的jar包,而.jar文件是经过spring-boot的maven插件处理过后的jar,springboot的maven插件会将原始jar重命名成.jar.original,然后按springboot自己的规范打出一个可执行的jar包。

将该jar包重命名成.zip文件后打开即可看到文件中的内容:

e973bf68d4fccbc53d24b3e7257b3389.png

可以看到,springboot执行的jar并不是一个java标准的jar,其中包含了springboot自身定义的内容。我们再打开其中的META-INF/MANIFEST.MF文件,看看其中指定的内容:

0b7c6d18017e7309876906e4d74a4986.png

Main-Class是其中的启动类,springboot打包出来的jar,启动类并不是工程中包含main方法的启动类,而是springboot自己的JarLauncher类,而工程中定义的启动类在这里变成了Start-Class,由此也可以看出springboot应用在IDE里通过main方法运行与通过java -jar命令运行的区别。

SpringBoot应用的启动

打开springboot的Main-Class JarLauncher类,其中包含main方法:

6df67e4c646566866ad5c591c4d63955.png

这是springboot启动的入口,JarLauncher类继承自ExecutableArchiveLauncher类,进入到launch方法可以看到springboot有一个archive的概念,archive是归档的意思,springboot打出来的jar包就是一个archive。

ExecutableArchiveLauncher类的createArchive方法可以看到启动时的archive创建,通过当前类找到jar包的路径,并创建JarFileArchive:

7a7de14505e08c7f29d4c9b63cf0c5ef.png

通过getNestedArchives方法可以看到Archive是一个递归的概念,JarFileArchive中可以有其它嵌套的Archive:

a2d20aafa81d104deb873b3ef72fe2cf.png

在launch方法中,有getClassPathArchives方法的调用,此方法中调用了前面的getNestedArchives方法,传入的Filter是lambda表达式,通过isNestedArchive方法对JarFileArchive中的Entry做过滤:

17ad093897d41e248b0b878bccbee9fd.png

b05f95620491059b1251b5120f165f84.png

可以得知,springboot打出的archive jar包中,ROOT-INF/classes/目录被认为是一个嵌套的Archive,ROOT-INF/lib/下的每一个jar包也被认为是一个Archive

因为springboot的archive不是一个标准的jar包,java提供的ClassLoader无法加载到archive中的依赖以及class,springboot提供了新的classloader的实现用来做Archive中类的加载:

119f71103a77f464095641e826e61fc0.png

可以看到springboot使用的是LaunchedURLClassLoader这个ClassLoader做的类的加载。创建好类加载器后,需要调用Start-Class,即应用中的main方法:

8454bead573c3814e8ce049c324f7abc.png

MainMethodRunner.run方法非常简单,逻辑是通过反射调用应用的main:

8e259a8db4bbbd842bedae693c27d971.png

这一步之后,进入到了应用代码中。

SpringBoot应用初始化

在使用spring boot时,我们在main方法中调用SpringApplication.run进行初始化:

a7061af8d13cc428cb8b0562d6df6c60.png

在SpringApplication.run方法中做了Spring的初始化:

2efcb0a2b179f8ecaeff35f4c420d612.png

可以清晰的看到spring的初始化。创建ApplicationContext对象使用的是createApplicationContext方法,此方法实现如下:

929bfc7494a7ac054039f16b79576d33.png

对于非WEB应用,使用的ApplicationContext的实例是DEFAULT_CONTEXT_CLASS,此常用定义为AnnotationConfigApplicationContext类,在依赖注入中提到的这个类,此类用于实现注解配置的ApplicationContext。

回到启动类,启动类上加了一个@SpringBootApplication注解,此注解的定义:

b8a5b6dceb52a8ad2c6c3e1384c53864.png

前面Annotation的解析机制中提到,spring能通过解析@ComponentScan注解注册bean,但是springboot中,@ComponentScan标识在SpringBootApplication注解上,AnnotationConfigApplicationContext是定义在spring-context包中的,而@SpringBootApplication是定义在spring-boot-autoconfig中的注解,spring-context包并不依赖于spring-boot-autoconfig包,AnnotationConfigApplicationContext能通过@SpringBootApplication注解完成初始化是因为spring的注解处理工具类能识别出@SpringBootApplication的元注解@ComponentScan以及@AliasFor注解标识 的属性,实现逻辑在spring-core包中的AnnotationConfigUtils类中。

最后看看SpringApplication类的构造器:

33cda21c87f120b282d9208ce425d0d0.png

在getSpringFactoriesInstances方法中,使用了SpringFactoriesLoader:

d46189021e6832700e5c7b760a8a5123.png

打开spring-boot相关的包,能看到spring.factories文件:

bcc128571036eb4f221e9eda43de689b.png

SpringFactoriesLoader是spring-core中提供的类,用于处理spring.factories文件,SpringFactoriesLoader.loadFactoryNames方法会读取类路径下的所有META-INF/spring.factories文件:

83dec6ad003ae81952832467e7203c9c.png

AutoConfiguration

回到@SpringBootApplication注解的定义:

41b344ced7acd6935af33964f6ae7cd5.png

其注解上被标记了@EnableAutoConfiguration注解,此注解用于实现autoconfiguration。打开此注解可以看到它实际上是使用了注解解析机制中的@Import注解:

87f86f655d82ba97232f83bbfd0340b7.png

如何使用ImportSelector就回到了@Import的处理逻辑中(见前面的文章)。可以看到,实现autoconfiguration的入口正是这个EnableAutoConfigurationImportSelector类,此类的selectImports方法返回的是需要作为配置类的类,这里的具体作用就是拿到类路径下的所有的自动配置的类,其代码实现:

e1cef2ca870c3a32d6dbda62b28bcb7c.png

AutoConfigurationMetadataLoader.loadMetadata方法的实现比较简单

77ca243fb8aef5ac5f5ccfbac0a5c069.png

即从META-INF/spring-autoconfigure-metadata.properties文件中加载数据,此文件在classpath下可以有多个(每个jar包中都可以有一个),随便打开一个配置文件,看看其中的内容:

d435aefd328e77b528a19070b1d036a0.png

里面都是一些配置类。@Import将这些配置类导入给spring的注解处理器ConfigurationClassParser就完成了bean的配置。

另外,在@SpringBootApplication注解上,还标记了一个@ComponentScan注解,其中的excludeFilters中有一个是AutoConfigurationExcludeFilter:

bd09df209e4d4ac502c4dee81ef8bf05.png

此类会判断如果class标了@Configuration并且此类包含spring.factories文件中,则在处理@Configuration注解时排除此类:

9fb24234eb1c1abb4f5f1ae000aa0c75.png

上面的代码中,getAutoConfigurations方法是从SpringFactoriesLoader中取的EnableAutoConfiguration关联的类。

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

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

相关文章

TVDI计算流程

TVDI计算过程 下载数据的网站: https://ladsweb.modaps.eosdis.nasa.gov/search/ 所需数据modis的16天的ndvi数据(MOD13A2)和每8天的LST数据(MOD11A2) 北半球选择Terra,南半前选择Aqua,因为两个卫星旋转是相对的,太阳高度角不同,会有些许误差 利用modis处理工具(MRT)…

LSGO软件技术团队2015~2016学年第十二周(1116~1122)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

python append函数_让你python代码更快的3个小技巧!速度提高了一倍还多

大家好!今天呢,我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多,语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西,python 一个明显缺点就是运行速度慢,至少跟 C 语言没法比…

栅格计算面积

1.进行栅格重分类 2.重分类 3.打开属性,查看像元大小 4.打开属性表 5.添加字段 6.打开字段计算器 7.计算结果如下(单位一般为平方米)

autotools使用

Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢?本节要讲au…

LSGO软件技术团队2015~2016学年第十三周(1123~1129)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

[转]揭开正则表达式的神秘面纱

揭开正则表达式的神秘面纱关闭高亮[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm]引言正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符…

智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...

更多,更及时的干货内容,请加我们的微信公众号:wc_sfdj诚邀业内人士及机构向我们投稿,投稿有礼投稿邮箱:tougao51wctt.com来源 | 网络欢迎阅读本篇文章,文末有福利哦!(一)伺服系统综述1、伺服运动…

利用python爬取房价

​公众号二维码 爬取房价网站:(安居客)https://zb.fang.anjuke.com/loupan/all/ 由于该网站每隔一段时间需要进行验证(反爬虫),所以我们为了防止我们爬取信息的时候出现间断,所以需要借助execl来保证信息的连续性。 结果展示

python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度

Apriori算法的简介 Apriori算法:使用候选项集找频繁项集 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集…

LSGO软件技术团队2015~2016学年第十四周(1130~1206)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

java安装和环境配置

下载jdk 网址为https://www.oracle.com/java/technologies/javase-downloads.html 2.安装jdk 3.配置环境 以下都是在系统变量下新建 为jdk安装目录 D:\Program Files\Java\jdk-15.0.2 .;%JAVA_HOME%\bin;%JAVA_HOME%\lib\tool.jar; %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4.…

在Windows Azure中使用自己的域名

请参考:http://blog.smarx.com/posts/custom-domain-names-in-windows-azure 本文是对这篇文章部分解释和补充。 并请记住,此博客总是能给你在Windows Azure的开发中带来帮助。 域名解析机制浅析 域名解析,本是个很简单的事情:我们如若想将我…

LSGO软件技术团队2015~2016学年第十五周(1207~1213)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

Tomca安装

下载 官网: http://tomcat.apache.org/ 2.安装 默认 3.安装成功

知其所以然(续)

查了一下,上篇知其所以然(以学习算法为例) 是08年7月写的,现在已经是10年11月,过去了两年零4个月,这说明了三件事情:1,一个问题其实你可以一直放在脑子里面,利用暗时间 对…

geoserver安装(war安装+exe安装)

下载 官网:http://geoserver.org/ 方法一 当前只有war版本的 下载结果 tomcat安装最好不要使用exe版本的,因为会出现问题,页面加载不出来,所以大家只需要下载下来解压即可 然后将geoserver安装包中的war文件放到webappx下 然后…

LSGO软件技术团队2015~2016学年第十六周(1214~1220)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

LSGO软件技术团队2015~2016学年第十七周(1221~1227)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

postgresql+postgis安装

下载 官网https://www.postgresql.org/ 作者的电脑为win 下载结果为 postgis要选择下载对应版本的 官网http://www.postgis.org/ 以下安装最好装到除c盘之外的,否则有些安装需要权限,一般为d盘 用户名和密码都设置为postgres postgis安装教程 之前设置过…