maven包加载顺序和jvm类加载顺序

一、mvaven jar包加载顺序

Maven对版本不同的相同依赖包生效优先级:

  1. 不同依赖层级深度的遵从【最短路径优先】原则。

  2. 具有相同依赖层级深度的遵从pom中【最先声明优先】原则。

二、JVM类加载顺序

相同的类指:类的全限定名一样
问题:怎么优先加载自己写的类

  1. 解析:

    class文件所在位置, 直接在classpath下,在jar包中:

  • a.相同的类, 一个在web-inf/classes目录下, 一个在jar包中: 此时优先加载classes目录下的class文件。
  • b.相同的类, 都在jar包中:此时按照jar的装载顺序, 简单的如果没有其他的特殊处理, 就按照jar包的名字排序。 如先加载aa.jar中的文件,再加载bb.jar中的文件。
  1. 结论
  • a.将.class文件放在classes文件夹下
  • b.如果所有的class被打包为jar,就修改jar包的名字,保证先加载自己的jar包。

maven的加载类的机制也是文中b类结论,而不是很多博客中说的pom声明顺序,pom声明顺序可能只能保证jar包加载顺序,而class加载顺序通过声明顺序解决不了。

值得说的是,maven打成的jar包名称是以artifactId决定的,所以修改artifactId首字母就能准确的保证哪个包中的同名class先被加载了。

jvm类加载中的父类委派机制,解决的是重复加载问题,而不是类加载的顺序。

posted @ 2021-12-23 11:33  JaxYoun  阅读(2907)  评论(0编辑  收藏  举报