ServiceLoader не загружает реализацию из модуля
У меня есть Java-программа, которая состоит из 3 модулей: модуль, содержащий службу в качестве интерфейса, модуль, содержащий реализацию этого интерфейса, и модуль, содержащий клиент, который использует реализацию. Проблема в том, что в клиентском модуле я использую 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
, Чего там не хватает?
2 ответа
Просто была такая же проблема, как описано здесь. Проблема заключалась в том, что зависимость Provider (здесь: EmployeeServiceImpl.java) отсутствовала для Consumer (здесь: EmployeeServiceTest).
Самым простым решением в IntelliJ было бы добавить:
requires Provider
к Потребителю. Затем просто:
щелкните правой кнопкой мыши -> добавить зависимость
. После этого вы можете удалить требования провайдера и
System.out.println(loader.iterator().hasNext());
должен печатать true
Добавьте аннотацию @AutoService(EmployeeService.class) в класс EmployeeServiceImpl, например
@AutoService(EmployeeService.class) открытый класс EmployeeServiceImpl реализует EmployeeService {
.....