SpringBoot引入spring-boot-starter-web依赖后出现Unable to close ApplicationContext错误的问题求助
看起来你遇到的是Spring Boot引入spring-boot-starter-web后因类缺失导致的上下文关闭失败问题,我来帮你分析下核心原因并给出可行的解决思路:
错误核心原因分析
从你提供的堆栈日志里,最关键的报错信息是:
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
结合日志中显示的Spring Boot版本(3.0.2),问题根源在于Spring Boot 3.x已经全面从Java EE迁移到Jakarta EE规范,原来的javax.servlet相关包已经被替换为jakarta.servlet。如果你的项目存在依赖版本不匹配(比如Spring Security还是旧版本、第三方依赖引入了旧的javax.servlet-api),就会出现这个类找不到的情况,进而导致ApplicationContext无法正常关闭。
可行解决方案
统一Spring Boot依赖版本(优先推荐)
确保你的项目使用Spring Boot的parent父工程来统一管理所有Spring相关依赖的版本,这样能从根源避免版本冲突。在你的pom.xml中添加或确认以下配置:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.2</version> <relativePath/> <!-- 从仓库查找父工程 --> </parent>之后引入
spring-boot-starter-web和spring-boot-starter-security时,会自动匹配对应版本的依赖,它们默认使用Jakarta EE的Servlet API,不会再出现javax.servlet.Filter找不到的问题。排查并排除冲突依赖
如果已经使用了parent父工程但问题依旧,可能是某个第三方依赖强行引入了旧的javax.servlet-api。你可以通过以下命令查看项目的依赖树:- Maven项目:执行
mvn dependency:tree - Gradle项目:执行
./gradlew dependencies
找到引入javax.servlet-api的依赖后,在对应的依赖配置中排除它:
<dependency> <groupId>第三方依赖的groupId</groupId> <artifactId>第三方依赖的artifactId</artifactId> <version>依赖版本号</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>- Maven项目:执行
正确引入安全相关依赖
如果你是为了实现登录安全功能,建议直接引入spring-boot-starter-security依赖,它会自动和spring-boot-starter-web适配,不需要单独引入Servlet相关依赖,且在Spring Boot 3.x版本下天然支持Jakarta EE规范。
备注:内容来源于stack exchange,提问作者ABHIJIT BEHERA

