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

Jetty11启动报错:DefaultServlet非jakarta.servlet.Servlet

问题排查:Jetty11 + Gretty 中 DefaultServlet 不兼容 jakarta.servlet.Servlet 的问题

核心原因分析

这个错误本质是Servlet API 包的命名空间冲突:Jetty11 完全基于 Jakarta Servlet API 5.0+(使用jakarta.servlet.*包名),如果项目中存在旧版javax.servlet.*依赖,或者Gretty插件引入了冲突的Servlet API版本,会导致org.eclipse.jetty.servlet.DefaultServlet(属于Jakarta命名空间)无法被识别为jakarta.servlet.Servlet接口的实现类——类加载器可能加载了来自不同命名空间的接口,造成类型不匹配。

具体排查步骤

  • 确认Gretty插件版本兼容性:Gretty对Jetty11的支持从3.1.0版本开始,确保插件版本达标。在build.gradle中检查:
    plugins {
      id 'org.gretty' version '3.1.0' // 或更高兼容版本
    }
    
  • 强制统一Servlet API依赖:在项目根build.gradle添加依赖约束,确保所有模块都使用Jetty11对应的Jakarta Servlet API 5.0+:
    allprojects {
      dependencies {
        constraints {
          implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
        }
      }
    }
    
  • 排查依赖树中的冲突:执行命令查看依赖树,找出是否存在javax.servlet相关依赖:
    ./gradlew :configapi:CodeGenerator:configapi:dependencies --configuration compileClasspath
    
    若发现旧版依赖,通过exclude排除:
    dependencies {
      implementation('第三方依赖') {
        exclude group: 'javax.servlet', module: 'javax.servlet-api'
      }
    }
    
  • 验证Jetty依赖正确性:确保项目中引入的Jetty依赖均为11.x版本,且使用Jakarta命名空间的包,避免混入Jetty9/10的依赖:
    dependencies {
      // 正确的Jetty11依赖示例
      implementation 'org.eclipse.jetty:jetty-server:11.0.15'
      implementation 'org.eclipse.jetty:jetty-servlet:11.0.15'
      // 错误:禁止引入旧版Jetty
      // implementation 'org.eclipse.jetty:jetty-server:9.4.50.v20221201'
    }
    
  • 检查web.xml命名空间:如果使用传统web.xml,确保根元素使用Jakarta的命名空间:
    <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
             version="5.0">
      <!-- 配置内容 -->
    </web-app>
    
    避免使用旧版http://xmlns.jcp.org/xml/ns/javaee命名空间,否则容器会尝试加载旧版Servlet API。

额外验证步骤

  • 清理Gradle缓存,避免旧依赖干扰:
    ./gradlew clean build --refresh-dependencies
    
  • 明确指定Java17版本:在build.gradle中配置:
    java {
      sourceCompatibility = JavaVersion.VERSION_17
      targetCompatibility = JavaVersion.VERSION_17
    }
    

内容的提问来源于stack exchange,提问作者Gagan Basnet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:32:25