【问题标题】:NoClassDefFoundError when running Tomcat + Spring + Maven project (Eclipse)运行 Tomcat + Spring + Maven 项目(Eclipse)时出现 NoClassDefFoundError
【发布时间】:2011-10-09 07:12:40
【问题描述】:

我得到的是:

java.lang.NoClassDefFoundError: com/mongodb/DB
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:446)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:430)
at org.springframework.util.ReflectionUtils.getAllDeclaredMethods(ReflectionUtils.java:475)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:634)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:573)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1319)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:315)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:394)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:594)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4733)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

这个类在 maven jar 中(来自 M2 存储库)。我将 Maven 依赖项添加到 DeploymentAssembly(在我这样做之前我得到:java.lang.ClassNotFoundException:org.springframework.web.filter.CharacterEncodingFilter)。我使用 m2e 插件并将我的项目配置为 Maven 项目。我的应用程序部署到标准位置 /.metadata/.plugins/.../tmp0。在 WEB-INF/lib 里面我有所有必要的罐子。项目编译没有错误。我会做错什么?

一个准解决方案是将必要的库添加到 Tomcat lib 目录,但我不想这样做。我想强制 Tomcat 使用项目库。

【问题讨论】:

  • 我认为您缺少一个在编译时不需要但在运行时需要的库。请检查您的 WEB-INF/lib 目录中是否有 mongodb 的库。
  • mongo-java.driver-2.5.2.jar 存在于 .../tmp0/wtpwebapps/myproject/WEB-INF/lib 包含 com.mongo.DB 类。编译时也需要该类。我是否可能需要来自另一个 jar 或另一个 jar 版本的 com.mongo.DB?当我将此 jar 添加到 Tomcat lib 目录时,它工作正常(我得到另一个缺少类错误)

标签: eclipse spring tomcat maven noclassdeffounderror


【解决方案1】:

看起来您没有安装 m2eclipse WTP 集成。

如果是这样,这可能是错误部署的根源。安装 WTP 集成后,您无需更改部署描述符中的任何内容 - 插件应自动配置您的项目。如果不行,试试 RMB -> Maven -> 更新项目配置,但一定要先安装 WTP 集成。

【讨论】:

    【解决方案2】:

    我在尝试运行 mcv-ajaxmvc-basic 示例时遇到了类似的问题,这些示例随 Spring 3 分发(两者都是可在https://src.springframework.org/svn/spring-samples 获得 - 需要一个 SVN 客户端来下载它们,比如 TortoiseSVN)。

    我的 Tomcat6 启动日志中出现了这个 ClassNotFoundException。

    SEVERE: Exception starting filter characterEncodingFilter java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:269)
        at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4071)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4725)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
        at org.apache.catalina.core.StandardService.start(StandardService.java:525)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Feb 17, 2012 10:36:18 AM org.apache.catalina.core.StandardContext start
    SEVERE: Error filterStart
    Feb 17, 2012 10:36:18 AM org.apache.catalina.core.StandardContext start
    SEVERE: Context [/mvc-basic] startup failed due to previous errors
    

    我可以运行 Maven Clean 和 Maven Install 目标,没有错误,并且项目没有任何类路径错误。 我还按照here 的指示安装了 Maven Integration for Eclipse Extras 包下提供的 eclipse Maven Integration for WTP,但仍然没有运气......

    在我的例子中,问题可以在 Eclipse 的 Markers 选项卡中看到,作为警告(黄色惊叹号),并带有 Classpath Dependency validator Message 的描述 classpath entry org.eclipse.maven2_classpath.container 的实际问题不会被导出或发布。可能会导致运行时 ClassNotFoundExceptions。

    解决这个问题

    1. 右键单击问题描述,然后选择快速修复。
    2. 选择将关联的原始类路径条目标记为发布/导出依赖项
    3. 点击完成
    4. 执行 ma​​ven-cleanma​​ven-install
    5. 右键单击项目,选择在服务器上运行。选择要运行的 Tomcat 服务器,您应该会看到初始页面。

    结论 上述步骤帮助我使项目在我的 Eclispe 开发环境中成功运行。请尝试一下,看看它是否适合您。

    另一种似乎也有效的解决方案是

    1. 从 Eclipse 中删除项目,包括工作区中的所有关联文件。 (也从工作区中删除项目目录)
    2. 再次将项目从 SVN 签出到工作区
    3. 在eclipse中导入新项目,但是选择Maven\Existing Maven Project
    4. 从磁盘中选择项目并导入。

    亲切的问候,

    ta6hbe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2011-02-05
      • 2012-04-18
      • 2012-10-05
      • 2011-06-18
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多