启动Tomcat时出现ClassNotFoundException DispatcherServlet(Maven依赖项未复制到wtpwebapps)

25

我遇到过这个问题,并且只是偶然发现了一个(半)可靠的解决方案,因此想在这里发布一下,以帮助其他人或在我忘记时提醒自己,同时也想问一下是否有人知道根本原因以及为什么我的修复方法有效。

问题是 - 我有一个Spring 3 Web应用程序,我想使用Eclipse中的“运行服务器”选项在Tomcat 7服务器上运行它。对于某些项目,这只是正常工作,但对于某些项目,似乎处于破损状态,每次启动服务器时都会出现类未找到的错误: org.springframework.web.servlet.DispatcherServlet。

经过一些调查,我发现项目的Maven依赖项尚未复制到WEB-INF/lib中的 ${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

在注意到该项目在“问题”面板中存在警告后,我尝试了很多方法:

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

也许我应该更早地注意到这个问题。

无论如何,选择这个并执行"快速修复"将解决问题,然后我就可以愉快地运行我的项目。 快速修复的方法是:"将相关的原始类路径条目标记为发布/导出依赖项"。

问题是,虽然这样做有效,但我不知道它的含义。 在完成操作后,我看不到任何明显的项目配置更改。 我很想知道实际问题是什么,以及是否可以避免再次发生。 我还想知道是否有其他我自己可以尝试的方法(除了执行快速修复),因为我感觉自己已经尝试了几乎所有其他方法。

谢谢你的帮助。

4个回答

34
请查看项目属性下的“部署组件”部分。该页面的内容指定了您的项目如何组装为一个运行应用程序。特别地,这是您可以控制您的项目引用的库中哪些应该打包在一起的位置。选择添加 -> Java Build Path Entries。您将能够从现有的构建路径条目中选择要包含在组件中的条目。
您找到的快速修复程序为您完成了相同的操作。如果您想知道在内部发生了什么,请在快速修复之前和之后查看您的.classpath文件。快速修复使用一些组件信息标记类路径条目。

谢谢!如果我不理解它的工作原理,我会发现记住东西是不可能的,所以这很可能会在未来为我节省大量痛苦。 - Russell
太棒了。昨天我的Eclipse突然无缘无故地爆炸了,这真的帮了我很多。 - fforw
在此之后,您可能需要重新启动Tomcat服务器。 - ScottSummers

2
检查.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)发生冲突。相反,应该像Konstantin在接受的答案中提到的那样,在Eclipse的部署组件部分逐个选择每个jar包。 - chrisjleu
对我来说,<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/> 已经存在,但是我仍然遇到了 NoClassDefFoundError 的问题。当我前往 .metadata/.plugins/org.eclipse.wst.server.core/tmp0 位置时,我发现我的 Maven 依赖库中没有 Lib 文件夹,有什么提示吗? - Dipanshu Verma

1

0
今天我遇到了这个问题,在一个已经运行了很长时间的项目中。我尝试了以上所有解决方案,但是(1)我没有像帖子中那样在问题面板中看到警告;(2)我的部署程序Java构建路径条目没有显示其他可用于部署的内容;(3)org.eclipse.jst.component.dependency的.classpath条目已经存在; (4)我已经安装了Maven Integration for WTP。最后,我将我的项目从Tomcat服务器中移除,然后重新部署它,问题就消失了。

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