- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Jar包沖突问题调研及解决
如何解决包冲突问题
随着业务需求的不断扩展,应用中代码量也会逐渐增长,工程中引用的二方包或者三方包也自然而然会越来越多。因此,不可避免,可能存在引用的二方包或三方包相互冲突所导致的系统问题。 ?
本文将针对前段时间遇到的实际案例进行分析,旨在当遇到包冲突问题时该如何解决,并提供同事用 python 写的一个发现包冲突的小工具(十分有用!)
? 一 发现问题: ?
首先 ,让我们看下异常,这是在应用启动后,执行具体操作时所报的错误:
? Caused?by:?java.lang.NoSuchMethodError:?mon.collect.MapMaker.expireAfterWrite(JLjava/util/concurrent/TimeUnit;)Lcom/google/common/collect/MapMaker;????????at?com.taobao.treasure.client.TreasureClientImpl.init(TreasureClientImpl.java:31)????????at?com.taobao.treasure.client.TreasureClientFactory$1.getPipeline(TreasureClientFactory.java:95)????????at?ty.bootstrap.ClientBootstrap.co
nnect(ClientBootstrap.java:212)????????at?ty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:188)????????at?com.taobao.treasure.client.TreasureClientFactory$2.call(TreasureClientFactory.java:261)????????at?com.taobao.treasure.client.TreasureClientFactory$2.call(TreasureClientFactory.java:248)????????at?java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)????????at?java.util.concurrent.FutureTask.run(FutureTask.java:138)????????at?com.taobao.treasure.client.TreasureClientFactory.getClient(TreasureClientFactory.java:239)????????...?53?more
? 根据错误我们大概可以了解,工程中引用了一个名叫 mon.collect.MapMaker 的类,并调用了其中名为 expireAfterWrite() 的方法,但是系统在加载该方法时却表示没有找到该方法。
? 这是一个很明显的包冲突问题,这类情况的发生很可能是因为如下状况引起的:
?
? 如图,你引用了 2 个三方包 a.jar 和 b.jar , a.jar 中又引用了一个 c.jar ,假设 c.jar 的版本号为 version-1, b.jar 中也引用了 c.jar ,假设这里的 c.jar 相对于 a.jar 中的 c.jar 为较高版本,记为 version-2 , b.jar 中某个类引用了 c.jar 的类 classA 中的方法 method A() ,并且该方法只存在于高版本的 c.jar(version-2) 的类 classA 中,而不存在 c.jar(version-1) 的类 classA 中。
? 当系统编译加载时,系统可能编译加载 c.jar(version-1) ,也可能编译加载 c.jar(version-2) ,当编译加载 c.jar(version-2) 时,由于很多 jar 包都支持向下兼容,即高版本兼容低版本,因此不论 a.jar 调用 c.jar 还是 b.jar 调用 c.jar 一般都不会出问题。但如果此时刚好应用编译加载的是 c.jar(version-1) 中的类 classA 时,那么 b.jar 调用 Method A() 时便会报上述错误,因为 Method A() 函数只存在于高版本的 c.jar 中,而此时系统编译加载的却是低版本的 c.jar 。
?二 解决问题 ?
当遇到这类问题我们该如何解决呢 ? 主要有以下三步:
第一,?? 发现是哪个类发生了冲突;
第二,?? 发现冲突 jar 包,即冲突类存在于哪个 Jar 包
文档评论(0)