You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置正确,部署路径无误。

疑问

  1. 为什么我的应用中找不到DispatcherServlet类?
  2. 如何确保部署时包含所需的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:42:38