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

Maven/Java如何为指定接口选择实现类?以JAX-RS与Jersey为例

JAX-RS接口与Jersey实现的依赖解析疑问

我正在维护一个由Apache Maven管理的小型API客户端库项目,这个库核心只有一个实现类,负责从硬编码的API URL获取数据,供Spring服务器项目导入调用。

库的pom.xml中添加了以下依赖:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>${jersey.version}</version>
</dependency>

第一个依赖是Jakarta RESTful Web Services(原JAX-RS)的规范接口包,第二个是Eclipse Jersey的客户端实现。我之前疑惑为什么要添加多个HTTP客户端相关依赖,后来查资料了解到JAX-RS仅定义了REST服务的接口规范,Jersey是它的具体实现。

但客户端代码里只导入了JAX-RS的相关类,完全没有引用Jersey的内容:

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;

调用客户端时也是通过ClientBuilder.newClient()方法,全程只依赖规范接口,没有直接提及具体实现。

我的疑问是:

  • 当代码仅导入接口/规范时,Maven和Java应用是如何确定使用哪个实现类的?
  • 如果pom.xml中同时添加了多个同接口的实现,这种情况下会如何处理?

之前有人推荐我阅读《What is ServiceLoader and how is it used?》,但我没理解ServiceLoader为什么是这个场景下依赖解析的核心机制,希望和社区探讨相关的解析逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:02