升级至Java 11后Spring-Security-Web依赖javax.servlet.Filter编译报错
Spring Security 5.x系列(包括你使用的5.8.6)底层依赖javax.servlet API,并未迁移到Jakarta EE规范。你已经将项目中所有javax包替换为Jakarta,相当于项目整体环境切换到了Jakarta体系,但spring-security-web 5.8.6仍依赖旧的javax.servlet.Filter,两者API体系不兼容,最终导致类继承层次不一致的编译错误。
另外需要注意:Spring Framework 6.x及以上版本全面采用Jakarta EE规范,而Spring Security 5.x仅能兼容基于javax的Spring Framework 5.x。如果同时混用Spring Framework 6.x和Spring Security 5.8.6,版本不匹配会进一步加剧冲突。
结合你必须使用Java 11的限制,有两种可行处理方式:
方案1:降级Spring Framework到5.x系列
Spring Framework 6.x要求Java 17及以上,因此你只能将Spring Framework版本降级到5.x(最后一个兼容Java 11的Spring 5.x版本为5.3.x)。同时将之前替换的Jakarta包改回javax,保持项目API体系统一,spring-security-web 5.8.6的依赖即可正常工作。
方案2:调整Java版本到17+并升级Spring Security到6.x
如果允许将Java版本升级到17(Jakarta EE 9+的最低要求),可直接将Spring Security升级到6.x系列。该版本全面支持Jakarta EE规范,与Spring Framework 6.x完全兼容,能彻底解决javax和Jakarta的依赖冲突问题。
辅助检查步骤
- 用依赖分析工具确认依赖树:
- Maven执行:
mvn dependency:tree - Gradle执行:
./gradlew dependencies
查看是否有其他依赖意外引入javax.servlet或Jakarta.servlet的冲突版本,必要时通过<exclusions>(Maven)或exclude(Gradle)排除冲突依赖。
- Maven执行:
内容的提问来源于stack exchange,提问作者Nathan S

