Spring Boot部署Tomcat出现org.apache.jsp.index_jsp类找不到异常如何解决
Spring Boot WAR包部署Tomcat启动失败排查方案
根因定位
你遇到的java.lang.ClassNotFoundException: org.apache.jsp.index_jsp报错本质是Tomcat无法正常编译JSP文件,或编译后无法找到对应生成的类,结合Spring Boot打包部署外部Tomcat的场景,按以下步骤依次排查即可解决:
1. 项目打包配置校验
- 确认启动类适配外部Tomcat部署,需继承
SpringBootServletInitializer并重写configure方法,示例如下:
@SpringBootApplication public class SpringjwtApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringjwtApplication.class); } public static void main(String[] args) { SpringApplication.run(SpringjwtApplication.class, args); } }
- 确认Maven/Gradle依赖配置正确,以Maven为例,需排除Spring Boot内置Tomcat,同时引入JSP编译所需依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除内置Tomcat --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入JSP编译依赖,scope设为provided,使用外部Tomcat提供的依赖 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency>
2. WAR包结构校验
解压你上传的war包,确认以下路径正确:
- JSP文件需要放在项目
src/main/webapp目录下,打包后对应在war包根目录或WEB-INF/jsp路径下(需和你配置的Spring MVC视图前缀匹配),如果路径错误会导致Tomcat找不到JSP文件无法编译。 - 检查
WEB-INF/lib目录是否存在所需的业务依赖jar包,避免打包时漏依赖。
3. Tomcat环境校验
- 权限校验:Tomcat编译JSP生成的类默认存放在
/opt/tomcat/work/Catalina/localhost/目录下,运行Tomcat的用户需要该目录的读写权限,执行以下命令修改权限(替换为你实际运行Tomcat的用户名和组):
sudo chown -R tomcat:tomcat /opt/tomcat/work /opt/tomcat/temp /opt/tomcat/webapps
- 缓存清理:停止Tomcat服务后,删除以下目录和文件,重新上传war包启动:
/opt/tomcat/webapps/springjwt目录/opt/tomcat/webapps/springjwt.war文件/opt/tomcat/work/Catalina/localhost/springjwt目录
4. 版本兼容性校验
确认Spring Boot版本和外部Tomcat版本匹配:
- Spring Boot 2.x版本内置Tomcat 9.x,需部署到Tomcat 9.x版本,不能使用Tomcat 10+(Tomcat 10使用jakarta.servlet命名空间,和Spring Boot 2.x使用的javax.servlet不兼容)
- Spring Boot 3.x版本必须部署到Tomcat 10.1+版本
内容的提问来源于stack exchange,提问作者Sanindu
相关产品推荐
相关产品推荐

