浅谈两个jar包中包含完全相同的包名和类名的加载问题
首先从表现层介绍,后续后深入原理。
1、先简单介绍maven如何生成jar文件方便测试
配置了一个manifest标签来配置Main函数的入口。然后通过如下指令来实现打包。 mvnassembly:assembly maven-assembly-plugin 2.4 jar-with-dependencies Main.Main make-assembly package single
2、自定义两个jar包,其中包含相同包名和类名
与export的导入顺序有关。只会加载第一个,并且运行正常。
3、自定义jar和jdk包,其中包含相同的包名和类名
与export的导入顺序有关。同样是只会加载第一个,但是如果加载自定义的jar运行会报错。加载jdk正常。
protectedClass>loadClass(Stringname,booleanresolve)
throwsClassNotFoundException
{
synchronized(getClassLoadingLock(name)){
//First,checkiftheclasshasalreadybeenloaded
Class>c=findLoadedClass(name);
if(c==null){
longt0=System.nanoTime();
try{
if(parent!=null){
c=parent.loadClass(name,false);
}else{
c=findBootstrapClassOrNull(name);
}
}catch(ClassNotFoundExceptione){
//ClassNotFoundExceptionthrownifclassnotfound
//fromthenon-nullparentclassloader
}
if(c==null){
//Ifstillnotfound,theninvokefindClassinorder
//tofindtheclass.
longt1=System.nanoTime();
c=findClass(name);
//thisisthedefiningclassloader;recordthestats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1-t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if(resolve){
resolveClass(c);
}
returnc;
}
}
4、mvnjar包冲突常用命令
mvndependency:analyze,mvndependency:tree
以上这篇浅谈两个jar包中包含完全相同的包名和类名的加载问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。