Spring Boot TODO项目无法浏览器运行,报NoClassDefFoundError错误
问题分析
报错java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator的核心原因是:TagLibraryValidator类在Jakarta EE 9及以上版本(对应Spring Boot 3.x)中已被移除,而你的项目依赖中大概率引入了基于旧Java EE(javax.*包)的JSP/JSTL相关组件,和Spring Boot 3.x的Jakarta EE(jakarta.*包)环境完全不兼容。
解决方案
按以下步骤逐一排查修复:
1. 对齐依赖版本(针对Spring Boot 3.x)
直接移除所有旧的javax.servlet、javax.servlet.jsp、javax.servlet.jsp.jstl类依赖,替换为Jakarta EE版本:
<!-- pom.xml中替换为Jakarta版JSTL --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> </dependency> <!-- 若需要JSP支持,添加Spring Boot 3.x兼容的Tomcat Jasper依赖 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>
2. 清理依赖冲突
用依赖分析工具排查间接引入的旧javax.*包:
- Maven执行命令:
mvn dependency:tree,找到包含javax.servlet.jsp.tagext的依赖,通过<exclusions>标签排除 - Gradle执行命令:
./gradlew dependencies,同理排查并排除冲突依赖
3. 确认打包方式(针对JSP视图)
Spring Boot 3.x对JSP的支持仅局限于war打包,如果当前是jar打包,JSP文件无法被正确加载,会触发错误。需修改pom.xml的打包配置:
<packaging>war</packaging>
4. 替换视图技术(可选更优方案)
JSP本身和Spring Boot的适配性较差,建议替换为Thymeleaf这类更适配的视图技术,彻底规避版本兼容问题:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
之后将原src/main/webapp下的JSP文件迁移到src/main/resources/templates目录即可。
内容的提问来源于stack exchange,提问作者Tanu Jain
相关产品推荐
相关产品推荐

