通过IDEA快速定位以及排除了依赖冲突

小微 科技通过IDEA快速定位以及排除了依赖冲突已关闭评论111字数 5300阅读模式
摘要1、我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常。例如:NullPointException(NPE),I...

1、

咱们程序员在开发的时候时常会遇到各种各样的 BUG 问题,其中大部份是业务逻辑异样,还有一些是代码书写不规范酿成的异样。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

例如:NullPointException(NPE),IndexOutOfBoundsException 等等,其实这些咱们都好定位以及修复。然而还有一些运行时异样定位起来是尤其头疼的,那就是 jar 包冲突引发的异样。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

一般程序在运行时产生相似于 java.lang.ClassNotFoundException,Method not found: \'……\',或者稀里糊涂的异样信息,这类情况一般很大可能就是 jar包依赖冲突的问题引发的了。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

至于为何会产生 jar包依赖冲突?这类问题大致可以归纳为如下几个缘由:文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

版本不匹配,高版本依赖了低版本,或者低版本依赖了高版本。例如引入第三方库,然而第三方库基于的是 JDK7,而你们项目使用的是JDK8。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

重复引入不同版本jar包,造成使用过错。不少时候咱们引入第三方轮子,它们依赖引入某个基础工具使用的是 v 1.0 的 jar,然而咱们项目中自己也引入了该 jar,然而版本是 v 2.3,这时候就会造成项目中使用同一个组件然而依赖了两个不同版本的jar,冲突就会产生。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

可以看到,其实总的来讲 jar 包冲突的主要缘由就是依赖的版本冲突。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

2、异样产生文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

项目中需要导出报表,技术选型的时候,通常为选用 Apache POI,然而 POI 的使用方式比较基础,开发量大,容易呈现内存溢出的问题。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

斟酌到阿里开源了一套解析以及生成Excel的工具 - EasyExcel,拥有防止内存溢出OOM的情况产生,而且使用利便简单,所以就将它引入到了咱们的项目中,具体的使用版本是 1.0.2。文章源自微观生活(93wg.com)微观生活-https://93wg.com/24516.html

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.0.2</version></dependency>

而另外一个模块需要使用 POI 的将 Word 转成 PDF 的功能,所以同时又引入了如下 POI 的依赖:

<!-- poi utils --><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version></dependency>

咱们从 Maven Repository 可以发现,阿里 EasyExcel 1.0.2 依赖的 POI 也是 3.15,所以照理说应当是没问题的。

然而在接口调试的时候还是出问题了,而且异样信息很奇怪,不是看一眼就能知道问题缘由的并解决的。

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:377) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:131) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:693) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351) at org.apache.poi.openxml4j.opc.StreamHelper.saveXmlInStream(StreamHelper.java:80) at org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller.marshallRelationshipPart(ZipPartMarshaller.java:181) at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:560) at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1557) at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:248) at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:941) at com.alibaba.excel.write.ExcelBuilderImpl.finish(ExcelBuilderImpl.java:64) at com.alibaba.excel.ExcelWriter.finish(ExcelWriter.java:95) at com.pingan.haofang.creams.co妹妹on.utils.ExcelUtil.writeExcel(ExcelUtil.java:71) ...... ... 65 co妹妹on frames omitted

提取关键信息,可以看到过错类型 java.lang.AbstractMethodError,这个过错类型望名知义:抽象办法过错。这类类型的过错以及咱们上面说的 ClassNotFoundException 相似,很大可能就是 Jar包依赖冲突所致使的。

3、异样定位

那咱们来定位下是哪一个 jar 包冲突了,只需要将冲突的 jar 包排除了掉,留下正确的就能够了。

咱们可以看到过错类型是 java.lang.AbstractMethodError,过错类型后面是具体的过错信息描写 :org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z,意思是在包 org.apache.xerces.dom 下的类DocumentImpl它的办法getXmlStandalone()调用呈现了过错。

那么具体是谁在调用呢?咱们在异样信息的紧密下一行可以看到如下这一行代码:

at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:377)

在包路径 com.sun.org.apache.xalan.internal.xsltc.trax 下,DOM2TO 类代码的的第377行,有个setDocumentInfo办法,咱们鼠标左键点进去,在该行加个 Debug 断点。

咱们发现这个 DOM2TO 类是 JDK1.8中 rt.jar 包里面的,具体类路径如下:

通过断点调试得知,这个 document 对象是 DocumentImpl 实例,

这个DocumentImpl 的真实路径也是 JDK1.8中 rt.jar 包里面的,它是 CoreDocumentImpl 的子类,CoreDocumentImpl 是接口Document 的实现类。

package com.sun.org.apache.xerces.internal.dom;public class DocumentImpl extends CoreDocumentImpl implements DocumentTraversal, DocumentEvent, DocumentRange { ......}

CoreDocumentImpl

package com.sun.org.apache.xerces.internal.dom;public class CoreDocumentImpl extends ParentNode implements Document { ......}

咱们在 CoreDocumentImpl 类中第983行发现了getXmlStandalone办法。

这时候报错缘由赤条条的摆在咱们眼前了,不言而喻,DOM2TO类中 setDocumentInfo 办法的参数 Document 是属于 JDK1.8 中 rt.jar 包下类路径 com.sun.org.apache.xerces.internal.dom 下的实现类 DocumentImpl。而咱们报错的信息提醒中是:

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z

这个 org.apache.xerces.dom.DocumentImpl 显明不属于咱们 JDK1.8 的 rt.jar 包,而且也没有 getXmlStandalone 这个办法。

所以得知,我的项目中 jar 包依赖冲突了,咱们只需要排除了掉 org.apache.xerces.dom.DocumentImpl 所属的 jar 包就能够了。怎么排除了呢?

4、排除了冲突

咱们在 IDEA 中双击 Shift 键,输入 DocumentImpl,得到如下结果:

可以发现,这里有两个 CoreDocumentImpl,一个是咱们的 JDK1.8的,一个是属于 xerce的,而且确切在依赖的 maven jar 包中发现了 xercesImpl-2.4.0.jar,这个 jar包就是需要排除了的 jar包。

发现了冲突的 jar包,我全局搜寻关键字 xerces,并无发现哪个 pom 中有依赖的代码,所以极可能是其他的 jar 包传递依赖进来的。

咱们借助 IDEA 的 maven 工具,在 maven 栏右键项目模块,选择 show Dependencies 或 Ctrl + Shift + Alt + U,这时候候会展现当前模块的 jar 包依赖图,如下:

尽管这里展现了不少冲突的jar包,其中红线连接的就是冲突的jar 包,然而咱们 Ctrl + F 查询 xerces 还是没有结果。

所以咱们需要额外的方式来解决,这时候我想到了 IDEA 有个插件 Maven Helper,具体的插件下载可以参考前面的内容,下载好插件后,咱们打开 pom.xml 文件,在pom.xml 文件的左下方有个 Dependency Analyzer,咱们点击以后显示如下:

Conflicts:展现所有冲突。

All Dependencies as List:以列表的方式展现所有依赖。

All Dependencies as Tree:以树形的方式展现所有依赖。

咱们输入 xerces,选择以树形展现所有依赖,得到如下的信息显示。

清晰明了,原来这个祸首罪魁是被 file-web-sdk 带进来的,咱们右键选择 Jump To Source或者 F4 定位到这个 jar 在 pom.xml 的依赖引入位置,如下图所示,咱们通过 exclusion 标签排除了 xercesImpl 的引入便可。

<dependency> <groupId>com.xx.xx.gov.fileservice</groupId> <artifactId>file-web-sdk</artifactId> <exclusions> <exclusion> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> </exclusion> </exclusions></dependency>

再次启动项目,测试接口发现功能正常了,整个排查进程也就收场了,IDEA的功能还是很强大的。

5、总结

不少时候的 jar 包冲突,有些是咱们很容易排除了,例如在pom.xml 中咱们就能够发现一些重复引入,然而版本不相同的依赖。还有一些是其他依赖传递依赖进来的,咱们在 pom.xml 文件中不能很直观的发现,这时候候咱们借助工具可以发现这类冲突的依赖。

然而还有一些是更隐蔽的冲突,就像

作者:jajiancnblogs.com/jajian/p/11002521.html

以上就是微观生活(93wg.com)关于“通过IDEA快速定位以及排除了依赖冲突”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/24516.html