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

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

问题 - 我有一个弹簧3 webapp,我想使用Eclipse中的“在服务器上运行”选项在Tomcat 7服务器上运行。对于某些项目,这只能工作,但有些项目似乎处于中断状态,每次服务器启动时,我都会得到一个找不到的类:org.springframework.web.servlet.DispatcherServlet。

经过一些调查,我发现该项目的 maven 依赖项尚未复制到 inWEB-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.

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

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

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

感谢您的帮助。


答案 1

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

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


答案 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>

它对我有用。


推荐