【问题标题】:ServiceLoader not loading implementation from moduleServiceLoader 未从模块加载实现
【发布时间】: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。那里缺少什么?

【问题讨论】:

标签: java java-platform-module-system


【解决方案1】:

刚刚遇到了与此处描述的相同的问题。问题是消费者(这里:EmployeeServiceTest)缺少提供者(这里:EmployeeServiceImpl.java)的依赖关系。
IntelliJ 中最简单的解决方案是添加:

requires Provider

给消费者。然后只是:
右键->添加依赖
之后,您可以删除 Provider 的要求和

System.out.println(loader.iterator().hasNext());

应该打印为真

【讨论】:

    【解决方案2】:

    在EmployeeServiceImpl类中添加注解@AutoService(EmployeeService.class) 喜欢

    @AutoService(EmployeeService.class) 公共类 EmployeeServiceImpl 实现 EmployeeService {

    .....

    【讨论】:

    • 这需要google auto-service 依赖,因此不是普通的java。在这一点上,我们不知道 OP 是否适合附加依赖项。此外,您的答案缺乏细节,可能需要额外的研究工作才能真正有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多