• 【原】Maven解决jar冲突调试步骤:第三方组件引用不符合要求的javassit导致的相关异常


    【环境参数】
    开发框架:Spring + MyBatis + SpringMVC + Kettle
    JDK版本:1.8.0_91
    javassist依赖版本:javassit-3.12.1.GA

    【障碍再现】
    在Kettle工具初始化时,抛出如下异常:
    java.io.IOException: invalid constant type: 15
    at javassist.bytecode.ConstPool.readOne(ConstPool.java:1090)
    at javassist.bytecode.ConstPool.read(ConstPool.java:1033)
    at javassist.bytecode.ConstPool.<init>(ConstPool.java:149)
    at javassist.bytecode.ClassFile.read(ClassFile.java:737)

    【问题原因】
        上述异常的原因是JDK8与javassit-3.12.1.GA在进行AOP功能时,由于不兼而导致的。经过调查得知,需要将javassit-3.12.1.GA升级为javassit-3.18.以上版本即可解决该问题。
        但此时发现“javassist.3.12.GA”这个依赖在系统的POM.xml中并没有对应的GAV配置,导致无法删除或者修改 “javassist.3.12.GA”这个依赖,因此,如何找到项目依赖的所有的Jar包中,哪一个Jar包引用了“javassist.3.12.GA”,就成了急需解决的问题

    【解决方案】
    Step 1:定位原系统中哪个第三方Jar包引用了“javassist.3.12.GA”。
    (1)将目录切换到原系统POM.xml所在目录。

    (2)打开cmd命令行窗口,执行命令"mvn dependency:tree > 1.txt"该命令会分析POM.xml文件中<dependencies>元素所包含的所有Jar包中,每一个Jar包引用其他Jar包的目录树,并且将这些信息打印到"1.txt"文件中,如下图所示。

    通过分析“1.txt”文件得知,“javassist.3.12.GA”这个版本的Jar包是原系统中 “scannotation.jar”包引用的,此时,需要将javassit-3.12.1.GA这个Jar包去掉,为原系统添加一个新的javassit-3.18.2.GA包。

    Step 2:从Jar包中去除javassist-3.12.1.GA

        由于已经定位了javassist-3.12.1.GA是被系统的scannotation组件所引用,所以我们直接让scannotation组件在打包时自动过滤掉javassist-3.12.1.GA即可。

     1 <dependency>
     2     <groupId>org.scannotation</groupId>
     3     <artifactId>scannotation</artifactId>
     4     <version>1.0.3</version>
     5     <exclusions>
     6         <exclusion>
     7             <groupId>javassist</groupId>
     8             <artifactId>javassist</artifactId>                    
     9         </exclusion>
    10     </exclusions>
    11 </dependency>

    Step 3:添加javassit-3.18.2.GA这个新的GAV

    1 <dependency>
    2     <groupId>org.javassist</groupId>
    3       <artifactId>javassist</artifactId>
    4       <version>3.18.2-GA</version>
    5 </dependency>

     【拓展:不兼容原因】

    Java 8的最新更新版本update 11导致了一些第三方工具不兼容问题。该bug似乎由Java 8u11中的JVM字节码验证子系统发生变化而导致的。Java语言要求任何调用超类构造函数必须在第一次调用时进行,但Java早期版本中的字节码验证器并没有强制去验证,甲骨文公司开始考虑解决这一问题,但目前来看似乎影响了一些第三方工具。

    【参考资料】 

    1.maven解决jar冲突调试步骤:http://blog.csdn.net/lk_blog/article/details/41554757
    2. Java 8升级导致第三方工具不兼容:http://www.iteye.com/news/29231

    【其他注意事项】
    读者如要转载,请标明出处和作者名,谢谢。
    本文地址:http://www.cnblogs.com/zjrodger/p/5641608.html
    作者名:zjrodger
    作者博客地址01:http://space.itpub.net/25851087
    作者博客地址02:http://www.cnblogs.com/zjrodger

  • 相关阅读:
    Linux如何修改命令提示符
    Linux命令详解-install
    Linux命令详解-info
    Linux命令详解-man
    Linux命令详解-printf
    Linux命令详解-echo
    Linux命令详解-whatis
    Linux命令详解-file
    Linux命令详解-help
    Linux命令详解-type
  • 原文地址:https://www.cnblogs.com/zjrodger/p/5641608.html
Copyright © 2020-2023  润新知