【问题标题】:ClassNotFoundException DispatcherServlet when launching Tomcat (Maven dependencies not copied to wtpwebapps)启动 Tomcat 时出现 ClassNotFoundException DispatcherServlet(Maven 依赖项未复制到 wtpwebapps)
【发布时间】:2011-06-14 04:54:00
【问题描述】:

我遇到过几次这个问题,只是偶然发现了一个(半)可靠的解决方案,所以我想我会在这里发布它以防它帮助其他人,或者我忘记它,并且询问是否有人知道根本原因是什么以及为什么我的修复有效。

问题 - 我有一个 spring 3 webapp,我想使用 Eclipse 中的 Run on Server 选项在 Tomcat 7 服务器上运行。对于某些项目,这可以正常工作,但有些项目似乎处于损坏状态,每次服务器启动时我都会得到一个找不到的类:org.springframework.web.servlet.DispatcherServlet。

经过一番调查我发现项目的maven依赖没有被复制到${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/中的WEB-INF/lib

我尝试了很多东西,最后才注意到该项目在问题面板中有警告:

Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result.

也许我应该早点注意到这一点。

无论如何,选择此选项并执行“快速修复”可以解决问题,我可以愉快地运行我的项目。快速修复是:“将关联的原始类路径条目标记为发布/导出依赖项”。

问题是,虽然这可行,但我不知道这意味着什么。完成后,我的项目配置看不到任何明显的变化。我很想知道实际的问题是什么,如果我能避免它再次发生。我还想知道我是否可以自己做一些事情(除了执行快速修复)来修复它,因为我觉得我几乎尝试了其他所有方法。

感谢您的帮助。

【问题讨论】:

    标签: java eclipse tomcat maven classnotfoundexception


    【解决方案1】:

    查看项目属性下的“部署程序集”部分。此页面的内容指定如何将您的项目组装到正在运行的应用程序中。特别是,您可以在此处控制项目引用的哪些库应与其打包。选择添加 -> Java 构建路径条目。您将能够在现有的构建路径条目中进行选择以包含在程序集中。

    您找到的快速修复为您做了同样的事情。如果您对幕后发生的事情感到好奇,请查看快速修复前后的 .classpath 文件。快速修复使用一些程序集信息标记类路径条目。

    【讨论】:

    • 谢谢!如果我不了解它是如何工作的,我发现不可能记住东西,所以这很可能会在将来为我省去很多痛苦。
    • 太棒了。昨天我的 Eclipse 突然无缘无故爆炸后,这对我很有帮助。
    • 在此之后您可能需要重新启动 tomcat 服务器。
    【解决方案2】:

    看来,你必须额外安装Maven Integration for WTP 插件。 它的描述可以在issues.sonatype.org找到。

    【讨论】:

      【解决方案3】:

      检查 .class 文件并替换以下条目

          <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER" />
      

      下面是:-

          <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
            <attributes>
              <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
            </attributes>
          </classpathentry>
      

      它对我有用。

      【讨论】:

      • 您不太可能希望导出整个 Maven 类路径,因为这可能会导致默认提供一些 jar 的应用程序服务器发生冲突(例如 servlet-api-2.5.jar、jsp -api-2.1.jar、jstl-1.2.jar)。相反,应在 Eclipse 的 Deployment Assembly 部分中逐个选择每个 jar,如 Konstantin 接受的答案中所述。
      • 对我来说 已经存在,但我仍然收到 NoClassDefFoundError,但是当我转到位置 .metadata/.plugins/org.eclipse.wst.server.core/tmp0 时,我在 Lib 中找不到我的 maven 依赖项,有什么提示吗?
      【解决方案4】:

      我今天在一个已经工作了很长时间的项目上遇到了这个问题。我尝试了上述所有解决方案,但是 (1) 我没有在问题面板中看到海报中的警告; (2) 我的部署程序集 Java 构建路径条目没有显示任何其他可部署的内容; (3) org.eclipse.jst.component.dependency 的 .classpath 条目已经存在; (4) 我已经安装了用于 WTP 的 Maven 集成。我终于把我的项目从Tomcat服务器中删除了,然后重新部署,问题就消失了。

      【讨论】:

        猜你喜欢
        • 2012-01-16
        • 1970-01-01
        • 2014-12-30
        • 2020-10-08
        • 2011-06-20
        • 1970-01-01
        • 2012-09-30
        • 2010-10-30
        相关资源
        最近更新 更多