Tomcat 10.1中使用JSTL报错:NoClassDefFoundError相关异常
解决Tomcat 10.1中JSTL无法使用的问题
问题原因
Tomcat 10.x 遵循 Jakarta EE 9+ 规范,所有Servlet、JSP相关API的包名已从 javax.* 迁移至 jakarta.*。你当前使用的JSTL 1.2基于旧Java EE规范(依赖javax.*包),与Tomcat 10.x不兼容,因此抛出java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator错误。
解决方案
1. 替换为适配Jakarta EE的JSTL版本
需要使用支持jakarta.*包的JSTL 2.0及以上版本,具体操作分两种情况:
Maven项目
在pom.xml中添加以下依赖(移除原有的jstl 1.2依赖):
<dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>
手动管理jar包
- 下载
jakarta.servlet.jsp.jstl-api-2.0.0.jar和jakarta.servlet.jsp.jstl-2.0.0.jar两个文件 - 将它们放入项目的
Calculator\src\main\webapp\WEB-INF\lib目录 - 删除原有的
jstl-1.2.jar
2. 更新JSP中的taglib指令
将JSP页面中原来的JSTL标签库引用替换为Jakarta版本的URI:
<%@ taglib prefix="c" uri="http://jakarta.apache.org/taglibs/std-lib" %>
3. 额外注意事项
- 不要将Servlet API或JSP API的jar包放入
WEB-INF/lib,Tomcat本身已提供这些API,重复放入会导致类冲突 - 确保项目编译级别为Java 8及以上(Tomcat 10.1支持Java 8~21)
内容的提问来源于stack exchange,提问作者Karthik 3489
相关产品推荐
相关产品推荐

