Spring是如何做到依赖的jar包不存在build也能通过

2019-10-25  本文已影响0人  Neal_Shan

Spring是如何做到依赖的jar包不存在build也能通过的,也就是说它集成那么多jar,怎么就能编译通过的。

答案就在maven的pom文件里

<dependencyManagement>

通过这标签就可以管理依赖版本,而不是在编译的时候打到jar包里去。

怎么就这么结束了,我要发问:

说说dependency下面的scope和optional呢,看过好多次了,就是不知道啥用。

其实在<dependency>标签下也有控制jar包是否被打包进去的配置。

1.<scope>test</scope>用来表示只有在测试的时候打进jar包。

2.<optinal>true</optinal>用来表示我引入了依赖H2并且我只希望H2被我这个模块用,其他模块引用我的模块时是不会传递过去的,也就是说这些个其他模块无法使用H2。

那么引入了jar包,这些类是怎么被加载进jvm的呢?

其实很简单,通过classLoader从classpath下的jar包中加载类,加载类的过程分为 加载 链接(验证 准备 解析) 初始化,关键就在于classLoader通过UrlClassPath获取到jar的路径,然后从jar中的manifest中将class的路径读出。

然而也并非完全如此,jar是可以没有manifest的,是不是不存在就直接读里面的文件列表了?

答案是对的,因为我们直接加载class也是可以的,不需要manifest,但是它可以加速识别类文件,给jar包加签名,加一些特性,比如可执行的jar需要Main-Class,可以指定classpath来定制jar的依赖。

小伙伴们可能还遇到过在idea里开发的时候文件是可以读到的,到了jar包里,就找不到了,其实在操作系统里用的是file://协议,不区分大小写,而在jar包里用的是jar://协议,严格区分大小写。

那么这个类到底加载到了jvm的什么地方?答案就是方法区。

那我实例化的对象又存在什么地方呢?答案是堆,堆里有(年轻代(EDEN 8 Survivor 2 = 1 + 1) 老年代)

有了对象,那么我的方法执行有要用到什么呢?答案是方法的计算使用栈,寄存器,本地方法栈。

大家可以继续问自己,栈,寄存器,本地方法栈又是用来做什么的呢?

上一篇下一篇

猜你喜欢

热点阅读