The nested exception is java.lang.IncompatibleClassChangeError: org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.

5

我是Spring的新手,需要在JDK7上使用Eclipse成功运行项目。该项目先前在JDK6上运行。

我已经准备好了所有源文件和原始项目所需的jar包。但是当我尝试运行它时,我得到以下异常:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\Users\e\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\DMControl\WEB-INF\classes\com\...\...\...\MyClass.class]; nested exception is java.lang.IncompatibleClassChangeError: org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor

我唯一的线索是第一次尝试运行时出现错误,提示我没有

标签。
org.springframework.core.io.support.SpringFactoriesLoader. 

我查看了我的spring-core-3.1.2.RELEASE.jar,发现确实没有SpringFactoriesLoader。检查了当前版本,发现确实缺少该类,它在spring-core-3.2.2.RELEASE.jar中。
所以我将spring jars更新到最新版本。但现在我得到了这个问题的异常。
有任何想法吗?
完整的堆栈跟踪:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\Users\e\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\FTAdControl\WEB-INF\classes\com\fashiontraffic\adcontrol\health\restwebservices\HealthWSImpl.class]; nested exception is java.lang.IncompatibleClassChangeError: org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
at javax.servlet.GenericServlet.init(GenericServlet.java:242)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1190)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1103)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1010)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4957)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5284)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5279)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.IncompatibleClassChangeError: org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:63)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257)
... 38 more

阅读:https://dev59.com/QnI-5IYBdhLWcg3wMFMf清理并构建。或者重新获取Spring库,正确地从类路径中删除所有内容,然后再尝试一次。 - Thihara
你改变了整个Spring库,因此你应该相应地更改依赖项,否则可能会出现上述错误... 你可以获取相关的二进制分发包,然后尝试仅更改其中的库... 我想大约有6个... - Thihara
你知道在哪里可以找到这些列表吗?在你给我的链接中可以找到列表中的那些已经在我的类路径中了。从异常信息来看,我可能有两个版本的AnnotationMetadataReadingVisitor类? - Eddy
感谢@DaveNewton,没错。这正是我需要的例子来理解它。我想有些人在意识到问题解决机器之前必须经历一些痛苦 :) 我在另一个主题中没有理解的是Maven不仅仅是另一个令人讨厌的配置文件,而且它实际上足够智能,可以解析并获取依赖项。非常棒。 - Eddy
我们提到的另一个线程在这里。http://stackoverflow.com/questions/15452874/maven-vs-eclipse - Eddy
显示剩余5条评论
4个回答

10

@Eddy,听起来你的类路径上有Spring 3.1和3.2的JAR包,有时候这并不是坏事,但有时它们不能很好地协同工作。

当我添加了spring-hateoas 0.4(它引入了spring-webmvc 3.1.x及其所有的Spring 3.1依赖项)到我的Spring 3.2.2项目中时,我遇到了相同的错误。

我排除了Spring 3.1的依赖关系,一切都恢复正常了。希望对你有所帮助。


谢谢@10gritSandpaper。我已经回到了之前的Spring版本,现在它可以工作了。 - Eddy
1
代表amirhd:重新部署解决方案之前,请确保运行maven clean。 - artless noise

3

这是由于JAR包版本不兼容导致的。你可以在这篇博客中找到更多细节。


2
这篇博客在哪里?请不要只发布链接。 - Christoph

0
在我的情况下问题出现了,因为我使用的是activemq-all库,它包含一个旧版本的Spring(目前我正在使用Spring 4.2.4.RELEASE),所以我将其更改为activemq-core库,问题得到解决。

0
<org.springframework-version>**4.2.1.RELEASE**</org.springframework-version> 

将pom.xml中的发布版本更改为最新版本(属性属性)
然后在所有的springframework依赖项中引用该属性。
这就是对我有效的方法!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接