• 一个jar包冲突引起的StackOverflowError


    项目运行中错误信息:java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/app] due to a StackOverflowError. 

    Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. 
    The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector

    解决办法:

    Run configuration  --> Arguments --> VM arguments -Xss4m

    以上方式治标不治本,我的错误信息里面已经提示的比较明显了:cyclic inheritance dependencies

    所以,这里靠谱的解决办法应该是:

    找到冲突的jar包,Excluded掉其中一个就是了

    如何找到冲突的jar包并Excluded掉?

    1、打开工程pom文件

    2、进入Dependency Hierarhcy视图

    3、选择其中一个jar包,右键Excluded Maven Artifact,。。。

    idea下解决办法:

    Run configuration  --> Arguments --> VM arguments -Xss4m

    以上方式治标不治本,我的错误信息里面已经提示的比较明显了:cyclic inheritance dependencies

    所以,这里靠谱的解决办法应该是:

    找到冲突的jar包,Excluded掉其中一个就是了

    如何找到冲突的jar包并Excluded掉?

    1、打开工程pom文件

    2、左下角进入Dependency Analzer视图,可以看到confilcts和All Dependency as tree

    3、选择其中一个jar包,右键Excluded Maven Artifact,。。。

    重启项目即可。

    通用方法:

    对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类、方法等,或者有时遇到一些日志系统的问题(参考另一篇文章Jar包冲突导致的日志问题),我们会遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException 之类的运行时异常,从经验上我们就会判断,Jar包冲突了。解决Jar包冲突问题,每个人都有每个人的方法,这里我介绍一下我的方法,供大家参考。

    处理方法

    当遇到jar包冲突时,我们首先确定是哪个jar包冲突了,这个很容易,看我们调用的类或方法,是属于哪个Jar包。然后就是要找出冲突了,我这里使用命令
    mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
    填写上Jar包的groupId和artifactId,可以只有一个,但是中间的冒号不要少,这样就会输出依赖树,而且是仅包含这个Jar包的依赖树,这样那些地方依赖了这个Jar包的那个版本就一目了然了。
    例如,我的项目中notify-common包存在冲突,我们使用命令
    mvn dependency:tree -Dverbose -Dincludes=:notify-common
    得到依赖树输出

    [INFO] com.taobao.wlb:bis-server:war:1.0-SNAPSHOT
    [INFO] +- com.taobao.wlb:bis-core:jar:1.0-SNAPSHOT:compile
    [INFO] |  - com.taobao.logistics:schedule-client:jar:1.1.1:compile
    [INFO] |     - (com.taobao.notify:notify-common:jar:1.8.15:compile - omitted for conflict with 1.8.19.26)
    [INFO] - com.taobao.notify:notify-tr-client:jar:1.8.19.26:compile
    [INFO]    +- com.taobao.notify:notify-common:jar:1.8.19.26:compile
    [INFO]    - com.taobao.notify:notify-remoting:jar:1.8.19.26:compile
    [INFO]       - (com.taobao.notify:notify-common:jar:1.8.19.26:compile - omitted for duplicate)  
    

    看一下依赖树中所有的叶子节点就是所有的notify-common包,我们可以看到我们依赖的bis-core中依赖了schedule-client包,它依赖了一个notify-common包,版本是1.8.15,第四行的后面也提示了这个包同其他包有冲突
    - omitted for conflict with 1.8.19.26)。而我们的系统依赖的notify-tr-client包所依赖的版本是1.8.19.26,于是我们知道是这里冲突了,在POM排除掉依赖,OK了。

    说明

    这里我们对我们执行的命令做一个简单的说明。
    mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
    第一部分mvn dependency:tree是maven依赖的分析命令,作用是对我们的项目的依赖进行分析,并输出项目依赖树
    第二部分-Dverbose的作用是添加了verbose一个环境变量,起的作用是在分析项目依赖时输出明细,这样项目中依赖的所有引用都会被输出出来,包含了所有的间接引用,会有很多很多,我们只需要我们要找的,所以就需要第三个参数了

    第三部分-Dincludes=<groupId>:<artifactId>的作用就是进行过滤,只包含我们想要的依赖的依赖时,排除掉其它不需要的,依赖树的所有叶子节点就是我们的找的依赖包。其中的groupId和artifactId可以只填写一个,为了保证准确性,一般都会填两个(填写时不包括尖括号)。

    其他方法:

    1、对于maven工程,我的办法是使用eclipse来解决,点开pom.xml,切换到hierarchy dependency,右上角搜索对应的包,可以清晰地看到冲突版本

    2、可以使用idea,在pom.xml中右单击 选择Diagrams-》show dependencies

    3、mvn dependency:tree -Dverbose > tree.log 
    直接输出冲突的jar文件

  • 相关阅读:
    解决margin 外边距合并问题
    tsx 校验 以及写法
    tsx 引入文件找不到
    Ubuntu 16.04安装和卸载软件命令
    Java8 中使用Stream 让List 转 Map使用总结
    Java8 Stream流式编程浅析
    浅析IOC 和 DI
    [ Java面试题 ]Java 开发岗面试知识点解析
    Intellij Idea 常用快捷键总结+实用小技巧
    Intellij Idea基础设置
  • 原文地址:https://www.cnblogs.com/yuhuashang-edward/p/10330489.html
Copyright © 2020-2023  润新知