美文网首页
Spring是如何做到依赖的jar包不存在build也能通过

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

作者: Neal_Shan | 来源:发表于2019-10-25 20:39 被阅读0次

    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) 老年代)

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

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

    相关文章

      网友评论

          本文标题:Spring是如何做到依赖的jar包不存在build也能通过

          本文链接:https://www.haomeiwen.com/subject/gpuevctx.html