Spring Boot整合JSP出现java.lang.NoClassDefFoundError异常求助
解决Spring Boot配置JSP渲染时的NoClassDefFoundError问题
嘿,我看你在给Spring Boot应用添加JSP渲染功能时碰到了java.lang.NoClassDefFoundError: org/apache/tomcat/util/security/Escape这个头疼的错误,这其实是Tomcat依赖版本不兼容导致的,咱们一步步来解决:
问题根源
Spring Boot的spring-boot-starter-web已经内置了适配好版本的Tomcat依赖,你手动引入的tomcat-embed-jasper如果和starter自带的Tomcat版本不匹配,就会出现这种类找不到的情况——毕竟不同版本的Tomcat里,部分类的位置或存在性会发生变化。
具体解决方案
1. 让Spring Boot自动管理Tomcat依赖版本
把你当前的Gradle依赖调整成这样,去掉手动指定的tomcat-embed-jasper:
// 保留核心web starter,它会自动引入兼容版本的tomcat-embed-jasper implementation 'org.springframework.boot:spring-boot-starter-web' // 可选:如果你的JSP需要使用JSTL标签,加上这两个依赖 implementation 'javax.servlet.jsp.jstl:jstl-api' runtimeOnly 'org.glassfish.web:jstl-impl'
另外提一句,Gradle 4.0之后官方推荐用implementation替代旧的compile关键字哦。
2. 核对项目结构与配置
确认你的文件路径和配置完全匹配:
- 你的JSP文件放在
/src/main/webapp/WEB-INF/jsp/index.jsp,和配置里的spring.mvc.view.prefix=/WEB-INF/jsp/、spring.mvc.view.suffix=.jsp完全对应,这点你已经做对了,没问题。 - 如果是Gradle项目,确保没有在
build.gradle里修改过web资源目录的配置,默认src/main/webapp是会被正确识别的。
3. 清理缓存并重新构建
有时候项目缓存会导致依赖加载异常,执行以下操作:
- 先清理项目:运行
./gradlew clean(Gradle)或者mvn clean(如果是Maven项目) - 再重新构建运行:
./gradlew bootRun或者mvn spring-boot:run
额外提醒
- Spring Boot对JSP的支持有个小限制:不能打包成可执行jar运行,因为JSP文件不会被打包到jar包里。如果需要打包成可执行文件,建议换成Thymeleaf这类更适配Spring Boot的模板引擎。
- 如果你确实需要自定义Tomcat版本,别单独指定
tomcat-embed-jasper的版本,而是在build.gradle里统一配置Spring Boot的Tomcat版本,比如:
// 填写和你的Spring Boot版本兼容的Tomcat版本号 ext['tomcat.version'] = '9.0.65' implementation 'org.springframework.boot:spring-boot-starter-web'
内容的提问来源于stack exchange,提问作者Kiran Kumar
相关产品推荐
相关产品推荐

