Tomcat 9.0.69添加跳过扫描JAR后仍无法启动求助
问题分析与解决方案
核心异常:Servlet API版本不兼容
java.lang.ClassCastException: class org.springframework.web.servlet.DispatcherServlet cannot be cast to class jakarta.servlet.Servlet 是导致服务器启动失败的根本原因——你的Spring Web组件依赖的是Jakarta Servlet API(jakarta.servlet.*),但Tomcat 9.0.x仅支持传统Java EE规范的Servlet API(javax.servlet.*)。
Spring 6.0及以上版本已全面切换到Jakarta EE规范,不再兼容javax包的Servlet API;而Tomcat 10.x及更高版本才原生支持Jakarta Servlet API。
解决办法二选一:
- 降级Spring版本:将spring-web、spring-webmvc等核心依赖降到5.x版本,Spring 5.x完全适配Tomcat 9的javax.servlet API。
- 升级Tomcat版本:如果不想降级Spring,直接把Tomcat换成10.0.x或更高版本。
Jar扫描配置无效的问题
你添加tomcat.util.scan.StandardJarScanFilter.jarsToSkip后无变化,还涉及workspace临时目录的jar,主要是这两个原因:
- 临时目录的jar是IDE编译/部署时自动生成的,里面大概率混杂了不同版本的Servlet API依赖
- 项目依赖中同时存在javax.servlet和jakarta.servlet的jar包,导致依赖冲突
处理步骤:
- 清理临时文件:删掉workspace下的temp、target(Maven)或build(Gradle)目录,重新编译部署
- 排查依赖冲突:确保项目里不同时存在javax.servlet和jakarta.servlet的jar,比如用Maven排除多余依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.0</version> <exclusions> <exclusion> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> </exclusion> </exclusions> </dependency> - 修正Tomcat扫描配置:如果改的是全局
conf/catalina.properties,确保配置格式正确:
也可以在项目的tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar,${catalina.base}/work/**/*.jarcontext.xml里单独配置:<Context> <JarScanner> <JarScanFilter defaultPluggabilityScan="false" jarsToSkip="*.jar"/> </JarScanner> </Context>
验证顺序
先解决Servlet API版本冲突(降级Spring或升级Tomcat),这是服务器能启动的前提;之后清理临时文件重新部署,最后检查日志确认异常是否消失。
内容的提问来源于stack exchange,提问作者utente1234567890
相关产品推荐
相关产品推荐

