使用Jetty 12 EE10与Spring Boot 3.2时出现javax.servlet.ServletContext类找不到异常
问题分析与解决方案
核心原因
出现javax.servlet.ServletContext类找不到的异常,本质是代码或依赖中存在对旧版javax.servlet命名空间的引用,而你使用的Jetty 12.0.15 ee10模块仅提供Jakarta EE 10规范的jakarta.servlet命名空间类,两者不兼容。
可能的触发场景:
- 第三方依赖未迁移至Jakarta,仍依赖
javax.servletAPI - Jetty模块配置不完整,或混入了ee8(javax)模块
- Spring Boot WAR打包配置有误,导致嵌入式Jetty的依赖影响独立部署
具体排查与解决步骤
1. 检查WAR中的冗余依赖
- 解压WAR包,查看
WEB-INF/lib目录,确认是否存在javax.servlet-api-*.jar或其他包含javax.servlet类的JAR文件。 - 如果存在,在构建工具中排除这些依赖:
Maven示例:<dependency> <groupId>问题依赖的groupId</groupId> <artifactId>问题依赖的artifactId</artifactId> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
2. 验证Jetty模块配置
确保仅添加ee10系列模块,且包含Spring Boot运行所需的核心模块:
- 执行以下命令添加完整的ee10 web模块:
java -jar start.jar --add-modules=ee10-webapp,ee10-servlet,ee10-jsp,ee10-security - 检查
start.ini或start.d目录,确认没有添加任何ee8(如ee8-webapp)模块,避免命名空间冲突。
3. 修正Spring Boot WAR打包配置
- 确保主类继承
SpringBootServletInitializer,适配独立Servlet容器:@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } - 将嵌入式Jetty依赖标记为
provided,避免打包进WAR:
Maven示例:<packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> <scope>provided</scope> </dependency> </dependencies>
4. 排除Jakarta Servlet API的打包
确保WAR中不包含jakarta.servlet-api-*.jar,因为Jetty已通过模块提供该API,重复打包会导致类加载冲突。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

