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 {

.....

Другие вопросы по тегам