Tomcat & Spring Web - 找不到类异常 org.springframework.web.context.ContextLoaderListener

Posted

技术标签:

【中文标题】Tomcat & Spring Web - 找不到类异常 org.springframework.web.context.ContextLoaderListener【英文标题】:Tomcat & Spring Web - Class Not Found Exception org.springframework.web.context.ContextLoaderListener 【发布时间】:2011-09-13 10:37:14 【问题描述】:

当我尝试通过 Eclipse 启动 Tomcat 时出现以下异常(通过右键单击项目,运行方式 -> 在服务器上运行)。

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:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4660)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Jun 12, 2011 8:46:11 PM org.apache.catalina.core.StandardContext listenerStart

我正在使用 Maven (m2eclipse) 构建我的项目。我已将必要的依赖项添加到 Spring 库中,并且可以在最终工件(包含该类)的 lib 目录中看到 spring-web.jar 文件。当我在 IDE 之外部署应用程序时,它工作正常。

任何关于为什么会发生这种情况的指针都将受到高度赞赏。

【问题讨论】:

如果您提供的信息正确,则说明 Eclipse 中的 Tomcat 部署不知道该 JAR。它在 IDE 之外运行良好的事实表明您拥有正确的 WAR,但 Eclipse 指的是其他东西。查找 Eclipse 分解版本,看看它缺失的地方。 在 eclipse 中哪里可以找到分解版? 【参考方案1】:

将这些文件(无论您碰巧使用哪个版本)添加到

apache-tomcat-8.0.35\lib 

文件夹(并重新启动您的服务器):

spring-aop-4.0.1.RELEASE.jar
spring-beans-4.0.1.RELEASE.jar
spring-context-4.0.1.RELEASE.jar
spring-core-4.0.1.RELEASE.jar
spring-expression-4.0.1.RELEASE.jar
spring-web-4.0.1.RELEASE.jar
spring-webmvc-4.0.1.RELEASE.jar

【讨论】:

【参考方案2】:

几天前,我在 Eclipse Indigo 上使用 m2eclipse(没有通过 m2eclipse-extras 提供的 WTP 集成插件)遇到了同样的问题。我创建了一个 Maven Web 模块并手动向其中添加了动态 Web 模块方面。当我在 Eclipse WST Tomcat 服务器上部署它时,当项目发布到它时,我的 Maven 依赖项似乎没有被推送到服务器。

解决方案很简单。在项目资源管理器中右键单击您的 Web 项目 -> 选择“属性”。在项目属性下,选择“部署程序集”。

Deployment Assembly 属性页显示将由 Eclipse 作为组装工件发布到服务器的内容。您需要告诉 Eclipse 您也希望发布所有 Maven 依赖项。

为此,请单击“添加”按钮,然后选择“Java 构建路径条目”。单击下一步并选择 Maven 依赖项。这将在 Eclipse 将您的项目发布到 WST 服务器时将 Maven 依赖 JAR 文件发布到 lib 文件夹。

这种方法对我有用。

【讨论】:

见鬼!对于所有来到这里的人。这是正确的答案! 这对我不起作用。我有一个 web 项目 A,它通过 pom.xml 依赖于 B; “Maven Dependencies”已经列在Deployment Assembly中,B也是。注意:B的部署路径是“WEB-INF/lib/B-0.1.0-SNAPSHOT.jar”,它不会根据是否改变B 在 Eclipse 中是否打开。 Eclipse 构建路径确实会正确更改(Eclipse 项目或我的 repo 中的 jar)以反映项目是否打开。我正在使用 SpringSource Tool Suite 2.9.2.RELEASE。即使类在 Eclipse 中解析得很好,我仍然在运行时得到 ClassNotFoundException。难住了。 谢谢!在这个问题上花了很多令人沮丧的时间之后,这篇文章读起来很享受……就像一个魅力! 我的 Maven 依赖项列在部署程序集中。尽管如此,有时还是会发生这种异常。 “雨舞”的解决方法是去掉war重启服务器,重新添加。但我希望有一个解决方案可以让这种舞蹈变得不必要。任何想法,为什么它有时可能不起作用? @AndreasEK:我有一个类似的问题,有时,我的 Maven 依赖项会从部署程序集中删除,我必须使用此答案中描述的方法重新添加它们...有没有办法让这种变化持久化?【参考方案3】:

判断 Eclipse 将在您的 war 文件中放入什么用于服务器部署的最简单方法是右键单击 -> 导出 -> WAR 文件。然后你可以解压它,看看里面有什么。

如果您打开“.settings/org.eclipse.wst.common.component”,您应该会看到 web 工具 webapp 的定义,并看到类似:

<project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="MyApp">
    <wb-resource deploy-path="/" source-path="/src/main/webapp"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
    <property name="java-output-path" value="target/classes"/>
    <property name="context-root" value="MyApp"/>
</wb-module>
</project-modules>

在 Eclipse 中的构建路径上,确保“Maven 依赖项”出现在库中。 m2eclipse 插件和 WST 的最新版本应该会自动获取 Maven 依赖项并将它们放入您的 war 文件中的 WEB-INF/lib 中。

最后但并非最不重要的一点是,您可能需要考虑选择最新的 SpringSource Tool Suite (STS) 副本。 STS 有很多不错的特性,包括捆绑了最新的 m2eclipse 和 WST。您仍然可以将它与 Tomcat(或它们的 Tomcat 版本)一起使用,并且它有一些原型和教程可以让 web 应用程序快速运行。

享受吧!

【讨论】:

以上是关于Tomcat & Spring Web - 找不到类异常 org.springframework.web.context.ContextLoaderListener的主要内容,如果未能解决你的问题,请参考以下文章

深入拆解Tomcat &Jetty——极客时间

JavaWeb - Spring容器 & SpringMVC容器 & Web容器的关系

web.xml是tomcat和spring间的桥梁,是tomcat构建spring运行环境的说明书

spring-boot-starter-tomcat 与 spring-boot-starter-web

Spring内嵌Tomcat&去Xml&调试Mvc

将 Spring Web App 从 tomcat 5.5 迁移到 tomcat 6.0 的问题