Jakarta EE 9开发JAX-RS客户端遭遇NoClassDefFoundError问题求助
解决JAX-RS客户端运行时
NoClassDefFoundError: jakarta/ws/rs/client/ClientBuilder问题 错误根源
这个运行时错误的核心原因是独立运行的客户端无法获取JAX-RS API类:
- 你的
jakarta.ws.rs-api依赖设置了<scope>provided</scope>,该scope表示依赖由应用服务器(GlassFish)在容器内运行时提供,但客户端是通过main方法独立启动的,不在GlassFish容器环境中,因此运行时类路径中缺失ClientBuilder所在的API包。 - pom.xml中存在拼写错误:
jakata.servlet的groupId应为jakarta.servlet,虽不直接引发当前错误,但会导致后续Servlet相关依赖异常,需一并修复。
修正后的依赖配置
调整jakarta.ws.rs-api的scope并修复拼写错误后的pom.xml依赖片段:
<dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>jakarta.enterprise</groupId> <artifactId>jakarta.enterprise.cdi-api</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency> <!-- 移除provided scope,确保运行时类路径包含该API --> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.0.0</version> </dependency> <!-- 修复groupId拼写错误 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.0</version> </dependency> </dependencies>
补充说明
- 独立运行的JAX-RS客户端需要JAX-RS API和客户端实现(jersey-client)同时存在于运行时类路径中,因此不能将API依赖设置为
provided。 - 若后续需将客户端代码部署到GlassFish容器内,可再将
jakarta.ws.rs-api改回providedscope,避免容器内依赖冲突。
内容的提问来源于stack exchange,提问作者Luigi Schiavone
相关产品推荐
相关产品推荐

