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进行详细解释,来说明为什么会是这样的情况,敬请期待。

 

转载于:https://www.cnblogs.com/bruceshao/articles/7115513.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值