org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myServices2': Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: Found class org.objectweb.asm.AnnotationVisitor, but interface was expected
Caused by: java.lang.IncompatibleClassChangeError: Found class org.objectweb.asm.AnnotationVisitor, but interface was expected
出现.IncompatibleClassChangeError异常了:
今天配置CXF2.4.2和spring4.0.2.RELEASE时一直再报:
Error creating bean with name 'myServices2': Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: Found class org.objectweb.asm.AnnotationVisitor, but interface was expected
Caused by: java.lang.IncompatibleClassChangeError: Found class org.objectweb.asm.AnnotationVisitor, but interface was expected
的错误,查看了自己的application-server.xml里面的bean配置没问题,找了一下午,最后发现是jar包冲突。
从字面含义分析,虚拟机期望使用的是一个Interface型的AnnotationVisitor,实际上Load进来的是一个Class型的。这种问题一般是由于Compile和Runtime使用的JAR包版本不一致导致的。而这种版本不一致,一般是由于Maven的包依赖冲突引起。
使用Ctrl+shift+T去查看org.objectweb.asm.AnnotationVisitor发现在maven项目依赖中发现一个Interface型的AnnotationVisitor和一个class的AnnotationVisitor,这就发生了版本冲突问题,我们需要的是一个Interface,所以需要剔除掉class类型的AnnotationVisitor
通过Eclipse的Dependency Hierarchy工具,对pom.xml中的包依赖关系,使用asm.AnnotationVisitor关键字进行Filter:
我们清楚的看到在我们项目的依赖中依赖了一个asm并且AnnotationVisitor类型是class类型的,所以我们需要剔除掉asm-5.2.jar
asm-5.2.jar中是一个class
而在3.3下是一个interface
我们需要的是一个接口interface,所以需要剔除掉asm-5.2.jar
果然发现某一个引用的依赖包中,依赖了5.2版本的sam,和本工程所依赖的asm-3.3.jar版本,产生了冲突。
根据项目需要,调整pom文件选定所需要的JAR版本,解决包依赖冲突后,即可解决java.lang.IncompatibleClassChangeError问题。
来源:oschina
链接:https://my.oschina.net/u/3725191/blog/1973400