Tomcat 10启动Spring MVC Maven项目无法加载WebApplicationInitializer问题
问题根因
- 命名空间不兼容:Tomcat 10及更高版本已全面迁移至Jakarta EE规范,Servlet相关类的包名从原来的
javax.servlet.*全部改为jakarta.servlet.*。你当前使用的Spring 5.3.12、javax.servlet-api 4.0.1均基于旧的Java EEjavax命名空间开发,与Tomcat 10的运行环境不兼容,导致WebApplicationInitializer无法被识别和调用。 - 项目未成功部署:从你提供的Tomcat运行日志中,仅能看到Tomcat自带的docs、examples、host-manager等默认应用的部署记录,没有你开发的
mvc-app项目的部署输出,说明项目并未被成功发布到当前运行的Tomcat实例中。
解决方案
你可以二选一执行:
方案1:降级Tomcat版本(改动最小,推荐)
直接将Tomcat版本降级到9.x系列,Tomcat 9仍使用javax.servlet命名空间,与你当前的依赖完全兼容,无需修改任何代码和pom配置,替换Tomcat后重新部署项目即可。
方案2:升级依赖适配Tomcat 10
如果需要继续使用Tomcat 10,需要做如下改动:
- 修改pom.xml中的Servlet依赖为Jakarta版本:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 升级Spring WebMvc版本到6.x及以上,Spring 6才开始支持Jakarta EE规范:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.0</version> </dependency>
- 修改
AppInitializer类的导入包,将所有javax.servlet替换为jakarta.servlet:
import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import org.springframework.web.WebApplicationInitializer; public class AppInitializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { System.out.println("<<<<<<<<<<<<<<<<<<<test>>>>>>>>>>>>>>>>>>>"); } }
补充检查项
- 确认你的IDE(Eclipse)的Tomcat配置中,
mvc-app项目已经被添加到部署列表中,部署上下文路径配置正确 - 项目打包后,检查
WEB-INF/classes目录下存在你的AppInitializer类对应的class文件
内容的提问来源于stack exchange,提问作者sumit
相关产品推荐
相关产品推荐

