Spring Boot启动失败:NoClassDefFoundError: jakarta/servlet/jsp/JspFactory
问题排查与解决方案
核心原因分析
出现java.lang.NoClassDefFoundError: jakarta/servlet/jsp/JspFactory异常,主要源于以下几个关键问题:
Servlet API包冲突
Spring Boot 2.4.2基于Java EE规范,依赖javax.servlet相关包,但你手动引入了jakarta.servlet-api(Jakarta EE规范),两者命名空间不兼容,直接导致类加载冲突,无法找到对应的JSP工厂类。Java版本不匹配
Spring Boot 2.4.2官方仅支持Java 8至Java 11,而项目指定了Java 17,版本兼容性问题会引发底层类加载异常。JSP依赖缺失(若使用JSP)
你注释掉了tomcat-jasper依赖,如果项目用JSP作为视图层,这个组件是Tomcat处理JSP的核心,缺失会导致JSP相关类无法加载。
具体修复步骤
步骤1:移除冲突的Jakarta Servlet依赖
删除POM中以下依赖:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> </dependency>
spring-boot-starter-web已经包含适配版本的javax.servlet-api,无需手动引入。
步骤2:调整Java版本或升级Spring Boot
- 方案A(推荐):升级Spring Boot版本
将父依赖版本改为支持Java 17的LTS版本,比如2.6.13:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.13</version> <relativePath/> </parent>
- 方案B:降低Java版本
将java.version改为11:
<properties> <java.version>11</java.version> </properties>
步骤3:添加JSP支持依赖(若使用JSP)
如果项目需要JSP视图,取消注释并添加tomcat-jasper依赖,Spring Boot会自动管理版本:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <scope>provided</scope> </dependency>
步骤4:清理并重新构建项目
执行Maven命令清理缓存并重新构建:
mvn clean install
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

