项目启动报错:java.lang.IncompatibleClassChangeError: Implementing class

项目添加了新的依赖包之后启动时报错了。部分报错内容如下:
Caused by: java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:3175) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:1372) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1860) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1734) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) at java.lang.Class.getDeclaredMethods(Class.java:1810) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:609) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:521) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:507) at

首先说结论:就是依赖版本号冲突引起的。

再说解决过程。一开始以为是包的问题,就把包放到别的环境,结果能启动,又换到另一个环境不能启动,而且包在自己机器上也能正常启动。这里是给我们误导最大的地方,以为是环境的问题。比较了两个环境的tomcat和jdk之后发现jdk的版本不一样;
然后方向放在了jdk版本上,最后当然是无功而返。
上网搜了搜基本都是版本号冲突引起的,然后研究 error log 才去比较各个依赖的版本号问题。
但是由于没有研究当时的error log 所以一直在盲目的查找依赖。但是依赖包有100多个,墨迹的找了三天还是没解决。再去研究error log 发现在某个特定的依赖包那报的错才定位到这个包,找到了包
引用的依赖 asm 和新加入的包引用的依赖版本号有了冲突.原先引用的asm 版本号是3.1的,新引入的是5.0的,最后研究这个包发现还有一个依赖stax和新引入的也是冲突的。

在这次解决过程中,犯了很多错误。对于报错日志没有重视起来,其实报错日志才是解决问题的首先参考依据,而不是自己的臆测。
也学到了不少东西,查看依赖冲突可以在pom文件中下面红框中快速定位到重复的依赖引用,方便取舍。

 





posted @ 2018-04-27 18:06  LittleAnts  阅读(3118)  评论(1)    收藏  举报