一、mvaven jar包加载顺序
Maven对版本不同的相同依赖包生效优先级:
-
不同依赖层级深度的遵从【最短路径优先】原则。
-
具有相同依赖层级深度的遵从pom中【最先声明优先】原则。
二、JVM类加载顺序
相同的类指:类的全限定名一样
问题:怎么优先加载自己写的类
-
解析:
class文件所在位置, 直接在classpath下,在jar包中:
- a.相同的类, 一个在web-inf/classes目录下, 一个在jar包中: 此时优先加载classes目录下的class文件。
- b.相同的类, 都在jar包中:此时按照jar的装载顺序, 简单的如果没有其他的特殊处理, 就按照jar包的名字排序。 如先加载aa.jar中的文件,再加载bb.jar中的文件。
- 结论
- a.将.class文件放在classes文件夹下
- b.如果所有的class被打包为jar,就修改jar包的名字,保证先加载自己的jar包。
maven的加载类的机制也是文中b类结论,而不是很多博客中说的pom声明顺序,pom声明顺序可能只能保证jar包加载顺序,而class加载顺序通过声明顺序解决不了。
值得说的是,maven打成的jar包名称是以artifactId决定的,所以修改artifactId首字母就能准确的保证哪个包中的同名class先被加载了。
jvm类加载中的父类委派机制,解决的是重复加载问题,而不是类加载的顺序。