Java项目迁Java11后测试遇Jakarta类ClassNotFoundException问题
问题原因与修复方案
问题原因
没错,就是测试运行时缺少JAX-RS的实际实现库导致的。jakarta.ws.rs:jakarta.ws.rs-api只是Jakarta RESTful Web Services的规范API包,仅包含接口、抽象类和注解,没有具体的业务逻辑实现。运行时必须依赖一个符合该规范的实现库,才能找到ClientBuilder的具体提供者(Provider)。
简便修复方法
只需在测试依赖中添加任意一个兼容Jakarta REST 3.x的实现库即可,以下是两种常用选项:
选项1:使用RESTEasy实现
适用于Gradle项目,添加到build.gradle:
testImplementation 'org.jboss.resteasy:resteasy-client:6.2.7.Final'
适用于Maven项目,添加到pom.xml:
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-client</artifactId> <version>6.2.7.Final</version> <scope>test</scope> </dependency>
RESTEasy 6.x系列完全兼容Jakarta REST 3.1规范,能自动注册ClientBuilder的提供者。
选项2:使用Jersey实现
适用于Gradle项目:
testImplementation 'org.glassfish.jersey.core:jersey-client:3.1.5'
适用于Maven项目:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.5</version> <scope>test</scope> </dependency>
Jersey 3.x是Eclipse官方的JAX-RS实现,同样支持Jakarta REST 3.x规范。
添加依赖后,测试运行时会自动加载对应实现的Provider,ClientBuilder.newBuilder()就能正常实例化了。
内容的提问来源于stack exchange,提问作者Undoht
相关产品推荐
相关产品推荐

