Jar包沖突问题调研及解决.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

sd47f8cI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档