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
相关产品推荐
相关产品推荐

