Spring MVC部署Apache Tomcat时遇DispatcherServlet类找不到异常求助
我正在使用Spring Tool Suite(STS)结合Apache Tomcat开发Spring MVC项目。部署应用时,DispatcherServlet初始化失败,抛出java.lang.ClassNotFoundException异常,找不到org.springframework.web.servlet.DispatcherServlet类。
错误日志
Dec 22, 2024 8:56:13 AM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet [myFrontController] in web application [/spring-hibernate-demo] threw load() exception
java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1308)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1120)
...
项目结构
spring-hibernate-demo ├── src │ ├── main │ │ ├── java │ │ │ ├── com.example.controller │ │ │ ├── com.example.entity │ │ │ ├── com.example.service │ │ │ └── com.example.config │ │ ├── resources │ │ └── webapp │ │ ├── WEB-INF │ │ │ ├── templates (contains Thymeleaf templates) │ │ │ ├── myFrontController-servlet.xml │ │ │ └── web.xml ├── pom.xml
关键配置
web.xml片段
<servlet> <servlet-name>myFrontController</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myFrontController</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
pom.xml片段
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.27</version> </dependency>
已尝试操作
- 确认spring-webmvc依赖已添加到Maven的pom.xml中。
- 检查target文件夹,发现部署的WAR文件的WEB-INF/lib目录中未包含所需的Spring JAR包(如spring-webmvc-5.3.27.jar)。
- 确认Tomcat配置正确,部署路径无误。
疑问
- 为什么我的应用中找不到DispatcherServlet类?
- 如何确保部署时包含所需的Spring JAR包?
1. 找不到DispatcherServlet类的核心原因
问题本质是部署的WAR包中缺失spring-webmvc相关JAR文件。Tomcat的类加载器只能从WEB-INF/lib目录加载应用依赖,找不到包含org.springframework.web.servlet.DispatcherServlet类的JAR时,就会抛出ClassNotFoundException。
常见诱因:
- Maven依赖的
scope错误配置:如果spring-webmvc的scope被设为provided,Maven会认为该依赖由Tomcat容器提供,不会打包进WAR。 - 项目打包类型未声明:pom.xml中缺少
<packaging>war</packaging>,Maven可能不会将依赖JAR复制到WEB-INF/lib。 - STS的Maven缓存异常:本地仓库缓存损坏,导致依赖未被正确下载或引入项目。
2. 确保部署时包含Spring JAR包的解决方法
步骤1:修正pom.xml配置
- 确认根节点已声明WAR打包类型:
<packaging>war</packaging> - 检查spring-webmvc依赖的scope,移除或确保不是
provided(除非Tomcat确实内置了该依赖,Spring MVC项目通常不需要):<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.27</version> <!-- 若存在此行则删除 --> <!-- <scope>provided</scope> --> </dependency>
步骤2:清理并重新构建项目
- 在STS中右键项目 → Run As → Maven Clean,清除旧的构建文件。
- 接着执行Maven Install:右键项目 → Run As → Maven Install。
- 检查target目录下的WAR包,确认WEB-INF/lib中已包含spring-webmvc-5.3.27.jar及相关依赖JAR。
步骤3:检查STS部署配置
- 右键项目 → Properties → Deployment Assembly。
- 确认
Maven Dependencies已添加到部署列表,目标路径为WEB-INF/lib。若未添加,点击Add → Java Build Path Entries → Maven Dependencies → Finish。
步骤4:刷新Maven依赖
- 右键项目 → Maven → Update Project...
- 勾选"Force Update of Snapshots/Releases",点击OK强制刷新依赖,修复缓存问题。
内容的提问来源于stack exchange,提问作者arnob rizwan

