项目添加了新的依赖包之后启动时报错了。部分报错内容如下:
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文件中下面红框中快速定位到重复的依赖引用,方便取舍。
