You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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.servlet API
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:20:01