Jakarta迁移后Jetty服务器配置异常:资源类未指定问题排查
排查CXF迁移Jakarta后Jetty启动异常:At least one resource class should be specified
异常原因
该异常由CXFNonSpringJaxrsServlet初始化时触发,核心问题是无法从指定的MainApplication类中获取到有效的JAX-RS资源类,常见诱因包括:
MainApplication未正确适配Jakarta规范(仍使用旧的javax包)MainApplication未重写方法返回资源类/实例- 资源类未使用Jakarta版本的JAX-RS注解
解决方案
1. 修正MainApplication类
确保类继承自Jakarta版本的Application,并明确返回资源类集合:
import jakarta.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; public class MainApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resourceClasses = new HashSet<>(); // 添加你的所有JAX-RS资源类,例如订单服务资源类 resourceClasses.add(OrderResource.class); // 若有其他资源类,继续添加 // resourceClasses.add(AnotherResource.class); return resourceClasses; } }
注意:所有资源类的注解(
@Path、@GET、@POST等)必须来自jakarta.ws.rs包,而非旧的javax.ws.rs包。
2. 确认Servlet初始化配置
检查代码中初始化参数的正确性:
- 确保参数键为
jakarta.ws.rs.core.Application,这是CXF 4.x适配Jakarta后的正确参数名 - 确认
MainApplication类在类路径中可被正常加载,无类找不到的隐性错误
3. 备选方案:直接指定资源类
若不想通过Application类管理资源,可直接在Servlet初始化时指定资源类:
// 替换原有Application参数配置 servlet.setInitParameter("jaxrs.serviceClasses", "com.yourpackage.OrderResource,com.yourpackage.AnotherResource");
验证要点
- 检查依赖中无javax和jakarta包的混合(例如排除所有
javax.ws.rs相关依赖) - 调试
MainApplication的getClasses()方法,确认返回集合非空 - 确认所有资源类已正确标记Jakarta版本的JAX-RS注解
内容的提问来源于stack exchange,提问作者PriyanWL2022
相关产品推荐
相关产品推荐

