精华内容
下载资源
问答
  • 建立c3p0连接池是时,报Mlog clients using java 1.4+ standard logging. 请问这是jar 包冲突造成的么。如何快速定位jar 包冲突造成的问题呢
  • 1、前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常...但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。一般程序在运行时发生类似于 java.lang.Cla...

    1、前言

    我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常。

    例如:NullPointException(NPE),IndexOutOfBoundsException 等等,其实这些我们都好定位和修复。但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。

    一般程序在运行时发生类似于 java.lang.ClassNotFoundException,Method not found: '……',或者莫名其妙的异常信息,这种情况一般很大可能就是 jar包依赖冲突的问题引起的了。

    至于为什么会发生 jar包依赖冲突?这种问题大致可以归纳为如下几个原因:

    • 版本不匹配,高版本依赖了低版本,或者低版本依赖了高版本。例如引入第三方库,但是第三方库基于的是 JDK7,而你们项目使用的是JDK8。
    • 重复引入不同版本jar包,造成使用错误。很多时候我们引入第三方轮子,它们依赖引入某个基础工具使用的是 v 1.0 的 jar,但是我们项目中自己也引入了该 jar,但是版本是 v 2.3,这时就会造成项目中使用同一个组件但是依赖了两个不同版本的jar,冲突就会发生。

    可以看到,其实总的来说 jar 包冲突的主要原因就是依赖的版本冲突。


    2、异常发生

    项目中需要导出报表,技术选型的时候,一般是选用 Apache POI,但是 POI 的使用方式比较基础,开发量大,容易出现内存溢出的问题。

    考虑到阿里开源了一套解析和生成Excel的工具 - EasyExcel,具有避免内存溢出OOM的情况发生,而且使用方便简单,所以就将它引入到了我们的项目中,具体的使用版本是 1.0.2。

    com.alibaba easyexcel 1.0.2

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

    org.apache.poi poi 3.15org.apache.poi poi-ooxml 3.15

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

    03070d7342903f9b00e75529de325e98.png

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

    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.common.utils.ExcelUtil.writeExcel(ExcelUtil.java:71) ...... ... 65 common 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 断点。

    c8a92443e08ea00f7141c39c687c2770.png

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

    da0548d06197bb07258e2af447d14170.png

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

    264324433709ef37811ae512a6e8068d.png

    这个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 这个方法。

    440186c0b243d641bf26bd4f8481f30d.png

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


    4、排除冲突

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

    ea1a6b231d5741e06a7df9a80bf5de6f.png

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

    f08092dbe4d112dfbd77cc55001b2670.png

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

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

    747d6ebc7d39815396c3bfac0fe32ca4.png

    虽然这里展示了很多冲突的jar包,其中红线连接的就是冲突的jar 包,但是我们 Ctrl + F 查询 xerces 还是没有结果。

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

    7365d7d0ca60475026d666cf06121630.png
    • Conflicts:展示所有冲突。
    • All Dependencies as List:以列表的方式展示所有依赖。
    • All Dependencies as Tree:以树形的方式展示所有依赖。

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

    05c62dcd83513c228885bfe205bc1d39.png

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

    com.xx.xx.gov.fileservice file-web-sdk xerces xercesImpl 

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


    5、总结

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

    但是还有一些是更隐秘的冲突,就像本文中描述的依赖冲突,这时候我们需要分析异常信息,并定位冲突的原因和找到具体冲突的依赖引入,最后将它排除就可以了。

    本文比较详细的介绍了异常的分析和冲突的定位,以及最后的排除。类似的依赖冲突基本都可以参考上述的方式进行排查,希望通过本篇文章对大家解决项目中依赖冲突有所帮助。

    cnblogs.com/jajian/p/11002521.html

    回复“资源”,领取 练手源码,视频教程,微服务、并发,数据可调优等,搜索【Java知音】

    4bda30d91f9a5b69963c0da09562174a.png
    展开全文
  • 开发java应用,包冲突是经常遇见的,如何快速定位冲突,并且解决十分重要。 下面通过工作中的一个例子来引出一些排查的常用工具。 (1)查看某一个方法是引用的那个包,可以在debug的时候通过反射中的这个方法...

    开发java应用,包冲突是经常遇见的,如何快速的定位冲突,并且解决十分重要。

    下面通过工作中的一个例子来引出一些排查的常用工具。


    (1)查看某一个方法是引用的那个包,可以在debug的时候通过反射中的这个方法看一下

    例如查看CollectionUtils这个类的jar包的信息,可以这样:

    CollectionUtils.class.getProtectionDomain().getCodeSource();


    (2)如何查看maven工程中的jar包的情况?

    在maven工程的父目录来执行这个命令,显示全部工程的包的信息

    mvn compile dependency:tree

    可以通过">"来重定向到一个文件,方便来进行查看。

    如果知道特定的子module,则可以进入到特定的module,来进行打印依赖树。



    上面的例子。在web这个module下面,果然没有看到commons-collections这个jar包。

    所以问题就定位了呵呵。



    (3)如何解决冲突?


    一般情况下问题定位了就能够很快的解决冲突了。

    上述情况是因为没有引入jar包导致的,解决办法,直接在pom文件中加入jar包即可,当然这是最简单的包问题了。

    其余的一般可以通过修改pom文件来进行解决,下面就pom文件解决冲突的几类常见方法说明一下。

     

    maven的冲突解决需要对于maven的依赖机制了解比较深入,这样处理问题才能游刃有余,推荐一个博客,上面的文章很好,可以学习一下。

     

    http://www.juvenxu.com/

     

    还有博客作者的书《maven实战》上面写的很详细,对于maven入门以及深入了解很有帮助。

     

    (4)线上的话如何来看代码的类的jar包的信息呢?

     

    上面的一些方法能够解决大部分的问题,但是如果是线上出现这种情况,或者上面的方法没有办法查看到,那如何处理呢。

    不用担心,公司的一位大神撒迦写了一个类,来搞定这些。

     

    博客地址在这里:http://rednaxelafx.iteye.com/blog/1295944

     

    代码和执行命令都在这里,有了这个之后,线上排查问题就能够非常方便了呵呵。

     

    https://gist.github.com/1441625#file_command_prompt

     

     

     

     

     

    展开全文
  • 前言 我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常...但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。 一般程序在运行时发生类似于java.lang.Cl...

    前言

    我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常例如:NullPointException(NPE),IndexOutOfBoundsException 等等,其实这些我们都好定位和修复。但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。

    一般程序在运行时发生类似于 java.lang.ClassNotFoundExceptionMethod not found: '......',或者莫名其妙的异常信息,这种情况一般很大可能就是 jar包依赖冲突的问题引起的了。

    至于为什么会发生 jar包依赖冲突?这种问题大致可以归纳为如下几个原因:

    • 版本不匹配,高版本依赖了低版本,或者低版本依赖了高版本。例如引入第三方库,但是第三方库基于的是 JDK7,而你们项目使用的是JDK8。
    • 重复引入不同版本jar包,造成使用错误。很多时候我们引入第三方轮子,它们依赖引入某个基础工具使用的是 v 1.0 的 jar,但是我们项目中自己也引入了该 jar,但是版本是 v 2.3,这时就会造成项目中使用同一个组件但是依赖了两个不同版本的jar,冲突就会发生。

    可以看到,其实总的来说 jar 包冲突的主要原因就是依赖的版本冲突。

    场景

    项目中需要导出报表,技术选型的时候,一般是选用 Apache POI,但是 POI 的使用方式比较基础,开发量大,容易出现内存溢出的问题。

    考虑到阿里开源了一套解析和生成Excel的工具 - EasyExcel,具有避免内存溢出OOM的情况发生,而且使用方便简单,所以就将它引入到了我们的项目中,具体的使用版本是 1.0.2。

    <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.common.utils.ExcelUtil.writeExcel(ExcelUtil.java:71)
        ......
        ... 65 common frames omitted

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

    异常定位

    那我们来定位下是哪个 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 包就可以了。如何排除呢?

    排除冲突

    我们在 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的功能还是很强大的。

    总结

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

    但是还有一些是更隐秘的冲突,就像本文中描述的依赖冲突,这时候我们需要分析异常信息,并定位冲突的原因和找到具体冲突的依赖引入,最后将它排除就可以了。

    本文章转载于:

    https://www.cnblogs.com/jajian/p/11002521.html

    展开全文
  • 目前笔者遇到的最多的是间接依赖导致的冲突,所以好多时候需要快速定位是哪些个jar都引用了某个依赖,但是该依赖的版本不一样导致的冲突。 现象:jar版本冲突比较常见的一个现象就是调用某个API时:出现java....

        前言出现jar包版本冲突的原因蛮多的,比如:版本没控制好,引入的第三方依赖的间接依赖的版本冲突等。目前笔者遇到的最多的是间接依赖导致的冲突,所以好多时候需要快速定位是哪些个jar包都引用了某个依赖,但是该依赖的版本不一样导致的冲突。

        现象jar包版本冲突比较常见的一个现象就是调用某个API时:出现java.lang.NoSuchMethodException异常。

        场景:比如你在工程pom中引入一个jar,调用它的某个接口,出现没有这个方法异常,而你又可以确认这个jar包已经引入工程了,在pom.xml的其它地方再没有该jar包其它版本的依赖。那就不用怀疑,这肯定是pom中某个依赖又间接或直接依赖了这个jar包的其它版本。

        1、笔者可以首先提供一个治标不治本的办法:调整jar包依赖顺序。

        在开发工具中,如:IDEA、eclipse都可以调整下依赖的jar包顺序,不清楚怎么调整可以查下相关资料。或者是把你显示依赖这个jar在pom.xml中的配置放到pom.xml的其它依赖的最前面,反正就是确认编译的时候这个jar会比导致冲突的那个jar最先加载就行。然后,你在IDE中运行测试的时候一般就会发现冲突的问题解决了。

        但是,之所以说这种属于治标不治本,原因在于两点:1、这并不是真的解决了,这个依赖于你的IDE,一旦发布部署,问题直接暴露。2、有些时候,连治标都治不了,比如一个多模块工程,内部依赖比较复杂,或者多层pom继承的比较多,这种情况下,也是有可能连治标都治不了了,当然也要看具体情况。

        治标不治本笔者还推荐的原因是因为:如果你无法确定是不是jar包冲突导致的时候,可以拿这种方法测试下,如果临时解决了,那就是冲突导致的,然后再确定哪个地方的原因。如果万一没解决掉,也不要认为就一定不是冲突的原因,换下面我说的方法确认下吧。

        首先,先简单说下dependency插件要用到的2个目标:

        Dependencytreelist

        这两个目标的执行命令分别是:mvn dependency:tree和mvn dependency:list。一个显示当前pom中的依赖树(所有依赖,直接/间接),list显示所有的依赖(直接/间接)

        ps:本文说到的解决问题的小思路主要以windows为例,Linux类似

        也可以不用命令,在IDE中如eclipse,打开pom.xml在编辑区的下方有一排tab,其中一个是dependency tree,打开之后,上面主要显示两部分,左边是依赖树(相当于执行mvn dependency:tree的结果),右边是依赖列表(相当于执行mvn dependency:list的结果),可以在左边依赖树慢慢看,看是哪个依赖冲突了,如果冲突会看提示的。然后再看是哪些jar依赖了这个Jar,但是版本不一致冲突的,然后解决就行了。

        如果不想一点点看,可以执行命令,比如windows,可以执行mvn dependency:list | findstr "jar的groupId"(findstr 相当于Linux的 grep),然后根据查找的关键字,会把这些jar都列出来,便可以看到都有哪些版本的依赖,便可以确定是冲突了,但是如果想要确定,是谁依赖的哪个版本,就需要用tree目标了。

        使用tree目标来查找依赖关系的,可以使用命令,把匹配住的前面几行也打印出来,就看到是谁的依赖了,如linux下的mvn dependency:tree | grep "groupId" --context=5(把找到的前后5行打印出来)。

        或者执行命令mvn dependency:tree > tree.log(windows或linux都能用),记录到一个文件内,然后用一个文件编辑器或者vim都行,用关键字去查找,都可以快速定位到的。

        一般查找到解决就好解决了,如用exclusions等把某个依赖去掉。当然了,也有其它一些办法,这都是要看情况的。

        后续有其它更快速定位的小技巧再进行补充。

    展开全文
  • Java中的概念 Java中的是封装一组类,子和接口的机制。软件包用于: 防止命名冲突。例如,可以有两个名称分别为Employee的类,college.staff.cse.Employee和college.staff.ee.Employee 更轻松地搜索/定位和...
  • 前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常...但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。一般程序在运行时发生类似于 java.lang.ClassN...
  • 1、前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常...但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。一般程序在运行时发生类似于 java.lang.Cla...
  • IntelliJ - IDEA插件推荐

    2020-05-29 21:47:31
    1. maven-helper 快速编译打包,上传仓库,查看pom依赖,解决...快速定位方法的XML实现 5.Lombok 注解替换Getter,Setter,toString,Construct @Builder是个好东西 6.Rainbow Brackets 七彩括号 7.Translation 高...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    day01_Android应用开发-快速入门 01_网络制式的概念 02_android简单历史 03_Android体系结构 04_JVM和DVM的区别 05_下载SDK 06_SDK目录结构 07_模拟器的创建 08_创建部署Android项目 09_Android项目目录结构 10_...
  • 数据结构与算法.xmind

    2020-06-19 17:04:23
    快速排序 思想 每次将比支点小的放在支点左边,比支点大的放在支点右边 做法 外循环while只要i和j不碰撞查找 内层两个while循环分别查找出比支点小的和比支点大的角标 ...
  • oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 ... 比尔.... 2000 年 6 月 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...
  • asp.net知识库

    2015-06-18 08:45:45
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp...
  • 在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使用。而在我们交换机的程序中大量使用指针,并且有增无减。 2、防止指针/数组操作越界 【案例1.2.1】 在香港项目测试中,发现ISDN话机...
  • OpenGL支持库中的部分英文名称常量已改为中文,并统一在所有常量名称之前加前缀“GL_”,以减少与其它库的冲突机率。 3. 互联网支持库中的“FTP目录列表”命令返回的文件时间改为FTP服务器返回的原始时间,不做...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

java快速定位包冲突

java 订阅