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 compileClasspathexclude排除: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
相关产品推荐
相关产品推荐

