【问题标题】:Class not found even though it should be on the classpath找不到类,即使它应该在类路径上
【发布时间】:2012-05-13 05:49:46
【问题描述】:

当我关闭在 Tomcat 上运行的战争时出现此错误:

[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 作为依赖项。更奇怪的是,我可以进入作为 spring-orm 3.1.1.RELEASE 类的 PersistenceAnnotationBeanPostProcessor 类,但它找不到在同一个 jar 中的 EntityManagerFactoryUtils 类。我猜它一定与它是抽象的或静态的有关,但我不确定进一步研究这个问题的方向。看起来它真的应该可用。

有人知道为什么会发生这种情况吗?

【问题讨论】:

  • 也许你有一个损坏的罐子?再次尝试清理并下载 deps。
  • @JeremyHeiler 我刚下载了我的罐子,这并没有改变任何东西。这对我来说有点莫名其妙。无论是在 eclipse 中运行还是在 Tomcat 的命令行上运行,都会发生这种情况。
  • 你有不同版本的jar吗?例如,也许在你的战争类路径和 tomcat 库中?
  • 检查整个应用程序的依赖层次结构。当我的应用程序的其余部分使用更高版本时,当包含一些将 spring.jar:2.0.8 作为传递依赖项引入的 jar 时,我遇到了这样的奇怪错误。因为工件 ID 发生了变化(Spring 将大的 spring.jar 拆分为较小的 spring-core、spring-beans 等),所以 Maven 将两者都拉入了您的应用程序。解决方法是找到包含旧 Spring jar 的依赖项并添加排除项。我第一次遇到它时花了几个小时。
  • 关于@JeremyHeiler 的评论,您是否从本地工件存储库和您使用的任何内部远程存储库(Nexus、Artifactory 等)中删除了 jar,从 Maven Central 获取新副本?当我们的 Nexus 实例被冲洗时,我们已经看到了像您这样的奇怪问题。或者有时重新索引你的远程仓库就可以了。

标签: java spring tomcat maven noclassdeffounderror


【解决方案1】:

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

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

【讨论】:

  • 我很快就会调查这棵树。我的战争中确实有罐子。在 tomcat 库中没有其他版本的战争。
  • 我会接受这个。由于一些与此问题无关的返工结果,我解决了我的问题,但无论如何它都解决了。我想这是某种类加载器问题。之前有一些奇怪的 Spring 和非 Spring 的混合混合,我们把它全部移到 Spring,现在这个问题已经消失了。
  • 我也面临同样的问题?你是如何通过移动弹簧和非弹簧问题来解决这个问题的?您能否详细说明您为解决此问题所做的工作?
  • 如何解决?除了“看看这个,也许就是这个”之外,它没有解决任何问题......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2016-02-04
    • 2017-09-12
    相关资源
    最近更新 更多