从 Eclipse 3.5 在 Tomcat 6 上运行 Spring + Maven2 项目时出现 ClassNotFoundException

Posted

技术标签:

【中文标题】从 Eclipse 3.5 在 Tomcat 6 上运行 Spring + Maven2 项目时出现 ClassNotFoundException【英文标题】:ClassNotFoundException when running a Spring + Maven2 project on Tomcat 6 from within Eclipse 3.5 【发布时间】:2011-02-05 10:08:34 【问题描述】:

当尝试从 Eclipse 中启动 Web 项目时,我得到:


SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3877)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
    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:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

当我切换到 Fedora 12 x64 时,项目开始失败。该项目在具有相同配置的 WinXP 上运行。

谷歌搜索我发现帖子声称转到 Project Properties -> Java EE Module Dependencies 并选中 Maven Dependencies 框可以解决问题。遗憾的是它对我没有用。

我正在使用 Spring 2.5.6、Maven2、Eclipse 3.5(带有 m2e 0.10.0 插件)、Tomcat 6 和 Java 6,在 Fedora 12 x64 上运行。

有人见过这个问题吗?

如果有帮助的话,我的 .classpath 文件


<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java"/>
    <classpathentry kind="src" output="target/classes" path="target/generated-sources/gpb"/>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>

    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>

    <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>
    <classpathentry kind="con" path="org.eclipse.iam.jdt.core.mavenClasspathContainer">
        <attributes>
            <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

更新:我在 Eclipse 之外构建或运行项目没有任何问题。

【问题讨论】:

只是猜测:可能是因为 org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER 和 org.eclipse.iam.jdt.core.mavenClasspathContainer 在某种程度上发生冲突? 【参考方案1】:

您的.classpath 中似乎同时包含Eclipse IAM 和M2Eclipse 内容。我会做一些清理工作:

仅使用其中一个插件(我建议使用 M2Eclipse)。 从 Eclipse 的工作区中删除您的项目,删除 .classpath.project 并再次将项目导入为 Maven 项目。

更新:要获得 M2Eclipse 的 WTP 支持,您需要从 m2eclipse Extras 更新站点:http://download.eclipse.org/m2e-wtp/releases/ 安装 Maven Integration for WTP,如下图所示:

【讨论】:

@pascalthivent,看来我在切换之前使用的是 Eclipse IAM 而没有注意到。无论如何,按照您的建议做了,但现在 Eclipse 不像 Web 应用程序那样看到该项目。所以现在我什至没有 Run As -> Run on Server 选项。 @Elliot 那是因为您在安装 M2Eclipse 时没有安装 Maven Integration for WTP。我将更新我的答案以涵盖这一点。 感谢 Pascal,最后的信息解决了我的问题。我删除了项目,安装了 WTP 的集成并再次导入了项目。唯一的细节是我必须禁用 Maven 插件,在终端中构建项目,然后再次启用该插件。现在一切都很顺利。一个想法,在我看来,Eclipse 在 Maven 支持上确实落后于 NetBeans。我觉得在 Eclipse 中工作效率更高,但不能在工作场所浪费时间处理此类事情。我认为 Eclipse 的形象因 Maven 插件的当前状态而受损。 @Elliot 很高兴它解决了。我可以理解您在遇到此类问题后的看法,即使最终更多的是用户问题(如果可以的话)。就个人而言,我发现 Eclipse 现在对 M2Eclipse 的 Maven 支持非常好,但其他人的反馈总是很有趣。 @Pascal m2eclipse 文档至少可以有一个注释说“如果你打算使用 WTP,你最好从 extras repo 安装 WTP 集成”。这意味着我第一次在 WinXP 上设置这个项目时,我完全靠运气做对了。这真的很糟糕,因为我被愚弄以为我掌握了 Eclipse 中的 Maven 项目(你可以看到我没有)。现在,如果不是这样,我将不得不在花更多时间解决问题或转移到我的同事还没有遇到问题的 NetBeans 之间做出决定。猜猜会赢什么。谢谢你的帮助,太棒了!【参考方案2】:

我有同样的症状,但原因不同。我不得不编辑我的 .classpath 文件。 maven 入口:

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

...缺少此处显示的属性标记。当我添加属性标签时,问题就消失了。我很好奇如何在 eclipse ui 中配置它。

【讨论】:

是的......这最终改变了错误消息,所以与应用程序相关......我想这是朝着正确方向迈出的一步 啊谢谢你这对我有用,刚刚添加了 现在可以了 【参考方案3】:

请注意,安装 WTP 集成的步骤已更改。

见:Maven/Tomcat Projects In Eclipse Indigo/3.7

【讨论】:

【参考方案4】:

时不时会遇到同样的问题。

由于一些奇怪的原因,这个问题可以这样解决

1) 右键单击​​项目 Maven -> 禁用 Maven 依赖项

2) 右键单击​​项目 Maven -> 启用 Maven 依赖项

【讨论】:

Eclipse 3.7.2 中没有这样的选项,你的意思是Disable Maven Nature

以上是关于从 Eclipse 3.5 在 Tomcat 6 上运行 Spring + Maven2 项目时出现 ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

从 Eclipse 中的项目中删除 Apache TomCat 运行时?

签署从 Eclipse 3.5 导出的 jar 文件?

eclipse中Tomcat的下载与安装 Tomcat安装 从安装到放弃

Eclipse 中的 Tomcat 6 配置

eclipse怎么集成tomcat

ssm 框架 -- eclipse4.6 安装插件 tomcat