java - ServiceLoader 未从模块加载实现
问题描述
我有一个由 3 个模块组成的 java 程序:一个包含作为接口的服务的模块,一个包含该接口的实现的模块和一个包含使用该实现的客户端的模块。ServiceLoader
问题是,在我用来加载服务的客户端模块中,但ServiceLoader
实例中没有服务。
我尝试在实现模块和客户端模块provides ... with
中的module-info.java
文件中使用关键字,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
解决方案
只是遇到了与此处描述的相同的问题。问题是消费者(这里:EmployeeServiceTest)缺少提供者(这里:EmployeeServiceImpl.java)的依赖关系。
IntelliJ 中最简单的解决方案是添加:
requires Provider
给消费者。然后只需:
右键单击-> 添加依赖项
之后,您可以删除 Provider 和
System.out.println(loader.iterator().hasNext());
应该打印为真
推荐阅读
- c# - if 块的重构
- r - 在 RSQLite 中使用数据类型
- regex - 多行字符串文字的语法高亮显示
- string - 来自 gcc 7 的 std::string 上的小字符串优化
- c# - Turtle Graphics - 进程因 StackOverflowException 而终止
- bash - sendmail:从 shell 脚本传递主题
- python - Python Keras - CNN 停留在 epoch 1
- wpf - 我们应该在使用 prism 命令时使用任何 Await/Async 吗?
- asp.net-mvc - 重定向 https 二级域 web-config
- php - 向 Woocommerce 3 中的“谢谢”页面添加附加消息