ClassLoader对冲突Jar加载顺序

 

在阿里面试的时候被问到了一个问题:对于相同路径,相同报名和类名的Class,ClassLoader会加载哪一个?

很不好意思的说当时面试挂了,我本以为会报错,编译的时候就会发现冲突而报错,结果确实不是,所以就对这部分进行了简单的测试,等后续有时间再进行详细的分析。

首先通过eclipse导出了两个jar:hh-cc-2.0.17.jar和hh-cc.2.0.18.jar,这两个jar中DBTableName中的D_MESSAGE_STATE字符串内容不一样,然后写了一个main方法调用了下,发现是读取的hh-cc-2.0.17.jar中的内容。如下:

确实是没有报错的,但是感觉非常奇怪,为什么呢?难道是用名字区分的吗?于是乎我把2.0.17修改称为了2.0.19,结果发现仍然是上面的结果。

这个结果让我觉得更加奇怪,也没地方有缓存呀,忽然我想起了一个在将jar添加到Build Path时其实在eclipse中有一个order的配置,是不是这个影响的呢?

果然,就是换了jar的名字,但是其顺序还是没变,所以仍然是用的2.0.17(因为代码调整比较麻烦,所以没截2.0.19的图)。

但是我们发布成相同的时候肯定不是通过eclipse进行配置的呀,那是通过什么呢?后来想到了其实有多种情况:

1、项目带有classpath的文件,这个里面可能有;

2、项目通过第三方组件调用jar,如warpper,里面是需要显式写明调用jar顺序的;

3、WEB项目

针对这三种场景分别做了详细的测试(第二种场景未做测试,请读者自行补脑),发现:

1、classpath文件中确实存在jar引用顺序的关系:

2、WEB项目的引用其实使用的是jar名字来区分的

PS:后面会对ClassLoader进行详细解释,来说明为什么会是这样的情况,敬请期待。

 

posted @ 2017-07-04 10:50  ~旗木卡卡东~  阅读(428)  评论(0编辑  收藏  举报