迁移Spring MVC至Tomcat10+Jakarta时JSP出现类型解析错误
问题分析:迁移至Tomcat10+Jakarta技术栈时JSP报错
javax.servlet.jsp cannot be resolved to a type 问题场景
近期将Spring Framework MVC项目迁移至Tomcat 10与Jakarta技术栈,JSP代码片段如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <c:set var="localeCode" value="${pageContext.response.locale}" />
Eclipse(Spring Tool Suite)提示错误:javax.servlet.jsp cannot be resolved to a type,移除${pageContext.response.locale}代码后错误消失。当前Maven依赖配置如下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>jakarta.el</groupId> <artifactId>jakarta.el-api</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> </dependencies>
核心原因
- JSTL标签库URI未适配Jakarta:你使用的JSTL URI是旧的
http://java.sun.com/jsp/jstl/core,对应传统javax.servlet.jsp.jstl命名空间。Tomcat10完全切换到Jakarta EE的jakarta.servlet.*命名空间,当EL表达式访问pageContext时,底层会尝试加载旧的javax.servlet.jsp类,但你的依赖只有Jakarta版本,导致类型解析失败。 - JSTL实现版本不匹配:Spring 6.0依赖Jakarta EE 10(Servlet 6.0),但你用的
org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0是Jakarta EE 9版本,版本不兼容会引发类路径冲突。 - IDE项目配置未更新:STS可能缓存了旧的Servlet/JSP facet配置(比如停留在Servlet 5.0及以下),没有同步到Jakarta对应的Servlet 6.0/JSP 3.1版本,导致IDE无法正确识别依赖。
解决方案
- 更新JSTL标签库URI:将JSTL的taglib替换为Jakarta官方URI:
<%@ taglib prefix="c" uri="https://jakarta.ee/xml/ns/jstl/core"%> - 升级JSTL实现版本:替换为适配Jakarta EE 10的版本:
<dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.0</version> </dependency> - 同步IDE项目配置:
- 右键项目 → Properties → Project Facets,将Dynamic Web Module设为6.0,JSP设为3.1。
- 执行
mvn clean compile,然后右键项目 → Maven → Update Project,刷新依赖并清除IDE缓存。
- 临时替代方案(可选):如果仍有问题,可以在控制器中将locale存入Model,再在JSP中获取,避免直接访问
pageContext.response.locale,但核心还是要解决命名空间和依赖的适配问题。
内容的提问来源于stack exchange,提问作者MTurPash
相关产品推荐
相关产品推荐

