Maven依赖构建版本冲突(实战cxf asm和cglib冲突)

℡╲_俬逩灬. 提交于 2019-12-05 05:48:11

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问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!