【环境参数】
开发框架: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即可。

 <dependency>
<groupId>org.scannotation</groupId>
<artifactId>scannotation</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>

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

 <dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</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

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

  1. maven 解决jar冲突

    那句话怎么讲来着的... 引用 如果你爱他,就请让他用Maven,因为那里是天堂,如果你恨他,就请让他用Maven,因为那里是地狱. Maven对于新手来说是<步步惊心>,因为它包罗万象, ...

  2. maven 解决jar包冲突及简单使用

    maven 解决jar包冲突 1.jar包冲突原因 maven中使用坐标导入jar包时会把与之相关的依赖jar包导入(导入spring-context的jar时就会把spring的整个主体导入) ,而 ...

  3. Maven 解决JAR包冲突

    在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择  “Dependency  Hierarchy” 2 ...

  4. maven中jar冲突解决

    Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题.本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲 ...

  5. Maven解决包冲突

    依赖树 $ mvn dependency:tree [WARNING] [WARNING] Some problems were encountered while building the effe ...

  6. 【原】Maven解决Jar包冲突

    一.起源 引入二方jar maven 包后出现 NoSuchMethodError org.apache.commons.lang3.StringUtils.isNoneEmpty . 第一感觉就是j ...

  7. Maven 基础(二) | 解决依赖冲突的正确姿势

    一.依赖原则 假设,在 JavaMavenService2 模块中,log4j 的版本是 1.2.7,在 JavaMavenService1 模块中,它虽然继承于 JavaMavenService2 ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  9. 解决maven生成的web项目下的servlet.jar与tomcat自带servlet.jar冲突的问题

    使用maven生成web工程后,编译需要下servlet-api.jar和jsp-api.jar文件. pom文件中的写法为: <dependency> <groupId>ja ...

随机推荐

  1. Redmine插件

    1.redmine_customize_core_fields可以对自带字段进行设置,看起来很不错,2016年6月23日上线,安装失败, 看来测试不完整.redmine_issue_field_vis ...

  2. CentOS 6.4 编译安装LLVM3.3,Clang和Libc++

    LLVM的最新版本3.3终于在6月17日发布了,按之前的计划6月5日就应该发布了,不过毕竟没有太晚,赶在VS2013 preview(6月26日微软Build大会)之前出来了.加上之前gcc4.8.1 ...

  3. C++11 move_iterator

    template<typename Iterator> class move_iterator { Iterator current; public: typedef Iterator i ...

  4. (转)MySQL数据库引擎ISAM MyISAM HEAP InnoDB的区别

    转自:http://blog.csdn.net/nightelve/article/details/16895917 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  5. Android多语言支持以及各国语言Values文件夹命名规则

    创建好的项目工程由于需求 需要做多国语言的支持  下面介绍怎么快捷的创建文件夹 建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录 这些都是程序默 ...

  6. Myeclipse普通工程转为Maven工程

    在SVN导出的Maven项目,或以前不是用Maven管理的项目想要转换成Maven项目,但Myeclipse中右键Configure 找不到(eclipse可行)Convert to maven pr ...

  7. 为SQL Server 增加链接到SQL Server 的链接服务器

    整体的分析一下好有一个思路.我们的目的是完成一个到远程服务器的链接. 第一:我们要知道这台服务器在哪(也就是要知道它的IP地址,如果是在同一个网络中知道它的计算机名也是可以的.因为一台服务器上可以安装 ...

  8. linux的学习系列 3---目录

    目录也是一个文件,它的唯一功能是用来保存文件及其相关信息.所有的文件,包括普通文件.设备文件和目录文件,都会被保存到目录中. 主目录 登录后,你所在的位置就是你的主目录(或登录目录),接下来你主要是在 ...

  9. 校验Linux程序是否被黑客修改

    一个黑客突破你的层层防御后,修改你的程序或者覆盖了你的工具时.确定一个已安装程序的所有文件,有没有被修改过的途径之一就是使用RPM包校验功能 如果图片排版有任何错误,欢迎访问我的简书www.jians ...

  10. leetcode刷题11. 盛最多水的容器

    做题连接https://leetcode-cn.com/problems/container-with-most-water/submissions/ 本题分为两种方法: 暴力法: int maxAr ...