【发布时间】:2019-01-08 19:10:20
【问题描述】:
我有一个由 3 个模块组成的 java 程序:一个包含作为接口的服务的模块,一个包含该接口的实现的模块和一个包含使用该实现的客户端的模块。问题是,在客户端模块中,我使用ServiceLoader 加载服务,但ServiceLoader 实例中没有服务。
我尝试在实现模块的module-info.java 文件中使用关键字provides ... with,在客户端模块中使用uses,如本教程所述:https://dzone.com/articles/java-9-kickoff-project-jigsaw-and-serviceloader-part-2
module-info.java 来自服务模块
module com.em.common {
exports com.em.common.model;
}
module-info.java来自实现模块
module com.em.implementation {
requires com.em.common;
provides com.em.common.model.EmployeeService with com.em.implementation.employee.EmployeeServiceImpl;
}
module-info.java来自客户端模块
module com.em.client {
requires com.em.common;
uses com.em.common.model.EmployeeService;
}
EmployeeServiceImpl.java
package com.em.implementation.employee;
import com.em.common.model.Employee;
import com.em.common.model.EmployeeService;
public class EmployeeServiceImpl implements EmployeeService {
public EmployeeServiceImpl() {
System.out.println("creating employee");
}
public Employee getEmployee(String firstName, String lastName) {
Employee employee = new Employee();
employee.setFirstName(firstName);
employee.setLastName(lastName);
employee.setDesignation("Unimportant Things Designer");
return employee;
}
}
EmployeeServiceTest.java
package com.em.client.employee;
import java.util.ServiceLoader;
import com.em.common.model.EmployeeService;
public class EmployeeServiceTest {
public static void main(String[] args) {
ServiceLoader<EmployeeService> loader = ServiceLoader.load(EmployeeService.class);
System.out.println(loader.iterator().hasNext());
}
}
System.out.println(loader.iterator().hasNext()); 打印 false 时预期是 true。那里缺少什么?
【问题讨论】:
-
在运行客户端模块时,模块路径上的服务实现模块是什么?
-
您找到解决方案了吗?我在这里面临同样的问题:stackoverflow.com/q/59369028/2130408
-
您似乎没有在服务模块中通过
uses“公开”服务接口,而是在客户端模块中,它应该只在服务模块上声明requires需要。见this blog post about Java 9 services and service providers
标签: java java-platform-module-system