Java 未找到类,即使它应位于类路径上

Java 未找到类,即使它应位于类路径上,java,spring,tomcat,maven,noclassdeffounderror,Java,Spring,Tomcat,Maven,Noclassdeffounderror,当我关闭在Tomcat上运行的war时,出现以下错误: [2012-05-03 11:55:36,082] ERROR - org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(501) | Destroy method on bean with name 'threadPoolTaskExecutor' threw an exception java.lang.NoClassDefF

当我关闭在Tomcat上运行的war时,出现以下错误:

[2012-05-03 11:55:36,082] ERROR - org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(501) | Destroy method on bean with name 'threadPoolTaskExecutor' threw an exception
java.lang.NoClassDefFoundError: org/springframework/orm/jpa/EntityManagerFactoryUtils
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessBeforeDestruction(PersistenceAnnotationBeanPostProcessor.java:357)
    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:193)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:498)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:474)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:442)
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)
    at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:958)
Caused by: java.lang.ClassNotFoundException: org.springframework.orm.jpa.EntityManagerFactoryUtils
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    ... 8 more
在pom.xml中,我将spring orm 3.1.1.RELEASE作为依赖项。更奇怪的是,我可以进入PersistenceAnnotationBeanPostProcessor类,这是一个spring orm 3.1.1.RELEASE类,但它找不到同一个jar中的EntityManagerFactoryUtils类。我猜这一定与抽象或静态有关,但我不确定进一步研究这个问题的方向。看起来它真的应该是可用的


有人想过为什么会发生这种情况吗?

事实上,这可能是一个排除问题(试着调用mvn dependency:tree来解决这个问题)


你在战争中有罐子吗?在Tomcat libs中是否还有另一个Spring jar?这可能是一个类加载器问题。

我通过删除一个maven模块中的冗余依赖项解决了同样的问题。
我对其他模块有直接依赖和间接依赖,这导致了这种行为。

也许你有一个损坏的jar?再次尝试清理和下载DEP。@JeremyHeiler我刚下载了我的罐子,但这并没有改变任何事情。这让我有点困惑。无论是在eclipse中运行,还是在Tomcat的命令行上运行,都会发生这种情况?例如,可能在war类路径和tomcat库中?检查整个应用程序的依赖关系层次结构。我遇到过类似这样的奇怪错误,当我的应用程序的其余部分使用了更高版本时,我将spring.jar:2.0.8作为一个可传递的依赖项包含进来。由于工件ID发生了变化(Spring将大型Spring.jar拆分为较小的Spring核心、SpringBeans等),Maven将这两个组件都引入到您的应用程序中。修复方法是找到包含旧springjar的依赖项&添加一个排除项。我第一次遇到它就花了几个小时。关于@JeremyHeiler的评论,您是否从您的本地工件回购和您使用的任何内部远程回购(Nexus、Artifactory等)中删除了JAR,并从Maven Central获得了新的副本?当我们的Nexus实例被冲洗时,我们看到了像您这样的奇怪问题。或者有时重新编制远程回购的索引就可以了。我将很快调查这棵树。在我的战争中我确实有这个罐子。tomcat libs中没有这场战争的另一个版本。我会接受这一点。我解决了我的问题,因为一些返工的结果并不打算与这个问题有关,但它还是解决了它。我想这是类加载器的问题。以前有一些奇怪的混合了Spring和非Spring的东西,我们把它们都转移到Spring,现在这个问题消失了。我面临着同样的问题?您是如何通过移动弹簧和非弹簧来解决问题的?你能详细说明你做了什么来解决这个问题吗?这是一个怎样的解决方案?除了“看看这个,也许是这个”之外,它没有提供任何解决问题的方法。。。