Java Web项目部署遇TagLibraryValidator类找不到错误
问题描述
我正在开发一个Java Web应用,部署项目时遇到如下异常:
java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.TagLibraryValidator at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na] at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na] at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) ~[na:na] at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]
环境配置
- Java版本:javac 17.0.10
- Web服务器/容器:Apache Tomcat 9.0.36
- 构建工具:Maven
已添加的依赖(pom.xml)
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>
已尝试的排查步骤
- 验证依赖已下载并存在于本地仓库
- 清理并重新构建项目
疑问
- 导致TagLibraryValidator出现NoClassDefFoundError的原因是什么?JSP标签库验证是否需要额外依赖?
- 这是否与Servlet API版本或类路径中缺少JAR有关?
- 如何解决该问题以成功运行和测试Web应用?
解决方案
问题原因分析
依赖冲突+类路径缺失:
javax.servlet.jsp.tagext.TagLibraryValidator是JSP API的核心类,你的项目同时混合了javax(Tomcat9使用的规范)和jakarta(Jakarta EE 9+规范)的JSTL依赖,导致类加载混乱;另外Tomcat9默认提供JSP API,但依赖冲突可能覆盖或排除了相关类,引发找不到类的异常。- JSP标签库验证不需要额外单独依赖,但必须保证JSP API在类路径中且版本与容器匹配。
与版本兼容性直接相关:
- Tomcat9对应Servlet 4.0、JSP 2.3规范,你引入的
jakarta.servlet.jsp.jstl-api 3.0.0属于Jakarta EE 9体系,和Tomcat9的javax规范完全不兼容;同时重复引入javax和jakarta版本的JSTL,进一步加剧了类路径冲突。
- Tomcat9对应Servlet 4.0、JSP 2.3规范,你引入的
具体解决步骤
清理冲突依赖:
删除pom.xml中所有jakarta命名空间的JSTL依赖,补充适配Tomcat9的JSP API依赖,修改后的pom依赖如下:<!-- JSTL 1.2(适配Tomcat9的javax规范) --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Servlet API 4.0.1(Tomcat9提供,scope设为provided避免重复打包) --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSP API 2.3.3(Tomcat9提供,scope设为provided) --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency>重新构建项目:
执行Maven命令清理并重新打包:mvn clean install验证Tomcat配置:
检查Tomcat的lib目录下是否存在jsp-api.jar,如果缺失,重新下载Tomcat9的完整安装包替换现有目录。检查打包配置:
确保Maven的war-plugin没有将providedscope的依赖打包到war包中,避免和Tomcat自带的API冲突。
内容的提问来源于stack exchange,提问作者shivam sharma
相关产品推荐
相关产品推荐

