Spring Boot 2.7.6启动失败:webServerStartStop Bean异常排查
解决Spring Boot 2.7.6启动时
JspServlet无法转换为javax.servlet.Servlet的问题 问题根源
Spring Boot 3.x基于Jakarta EE API(包路径jakarta.servlet),而2.7.x基于传统Java EE API(包路径javax.servlet)。版本切换后,若依赖中混入Jakarta版本的Tomcat组件或Servlet API,就会出现类转换异常。
具体解决步骤
强制统一Servlet API与Tomcat组件版本
在pom.xml的<dependencyManagement>中锁定对应版本(与Spring Boot 2.7.6匹配的Tomcat版本为9.0.68,Servlet API为4.0.1),避免依赖冲突:<dependencyManagement> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.68</version> </dependency> </dependencies> </dependencyManagement>清理依赖并排除Jakarta相关依赖
- 执行Maven命令清理本地缓存并重新构建:
mvn clean install -U - 用
mvn dependency:tree查看依赖树,找到引入jakarta.servlet的第三方依赖,在pom.xml中排除该依赖:<dependency> <groupId>[第三方依赖groupId]</groupId> <artifactId>[第三方依赖artifactId]</artifactId> <exclusions> <exclusion> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
- 执行Maven命令清理本地缓存并重新构建:
检查WAR打包主类配置
确保主类继承SpringBootServletInitializer并正确重写configure方法(Spring Boot 2.x WAR打包的必要配置):@SpringBootApplication public class RappersInfo extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(RappersInfo.class); } public static void main(String[] args) { SpringApplication.run(RappersInfo.class, args); } }调整Tomcat依赖范围(若外部容器部署)
如果是将WAR包部署到外部Tomcat容器,需将Spring Boot内置Tomcat依赖设为provided,避免与外部容器的Servlet API冲突:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
内容的提问来源于stack exchange,提问作者kalkam
相关产品推荐
相关产品推荐

