问题描述:
升级struts2,由2.1.8升级成2.5.26,启动项目出现异常
2021-03-31 14:37:04.345 [] ERROR (convention.DefaultClassFinder.<init>:95) [] - Unable to read class [com.u8.server.web.activity.ysdk.Partition]
java.lang.IncompatibleClassChangeError: class org.apache.struts2.convention.DefaultClassFinder$InfoBuildingVisitor has interface org.objectweb.asm.ClassVisitor as super class
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.7.0_80]
at java.lang.ClassLoader.defineClass(ClassLoader.java:800) ~[?:1.7.0_80]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.7.0_80]
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:3251) ~[catalina.jar:7.0.96]
at
原因分析:
这里重点主要看这句:
java.lang.IncompatibleClassChangeError: class org.apache.struts2.convention.DefaultClassFinder$InfoBuildingVisitor has interface org.objectweb.asm.ClassVisitor as super class
表达的是ClassVisitor是一个接口,但被struts2.convention用成了父类。
struts2.convention是struts2-convention-plugin-2.5.26.jar使用的类
ClassVisitor是asm.jar的元素,旧版本中ClassVisitor是一个接口,新版本改成了一个类
随着struts2的更新,struts2-core-2.5.26.jar会自带新版本asm-7.3.1.jar。不会有旧版本问题。
执行“mvn dependency:tree”命令,分析项目的依赖包结构,发现项目中依赖的cglib-2.2.jar依赖了asm-3.1.jar
推断出是旧版本cglib引用了旧版本的asm的原因
解决方案:
把cglib升级成cglib-3.3.0.jar,查看已经没有依赖asm
再次启动项目,成功,问题解决。