首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceLoader未从模块加载实现

ServiceLoader未从模块加载实现
EN

Stack Overflow用户
提问于 2019-01-08 19:10:20
回答 2查看 1.3K关注 0票数 1

我有一个java程序,它由3个模块组成:一个模块包含作为接口的服务,一个模块包含该接口的实现,一个模块包含使用实现的客户端。问题是,在客户机模块Im中,我使用ServiceLoader加载服务,但是ServiceLoader实例中没有服务。

我尝试在实现模块的module-info.java文件中使用关键字module-info.java,在客户端模块中使用uses,如本教程所述:https://dzone.com/articles/java-9-kickoff-project-jigsaw-and-serviceloader-part-2

来自服务模块的module-info.java

代码语言:javascript
复制
module com.em.common {
    exports com.em.common.model;
}

来自实现模块的module-info.java

代码语言:javascript
复制
module com.em.implementation {
    requires com.em.common;
    provides com.em.common.model.EmployeeService with com.em.implementation.employee.EmployeeServiceImpl;
}

来自客户端模块的module-info.java

代码语言:javascript
复制
module com.em.client {
    requires com.em.common;
    uses com.em.common.model.EmployeeService;
}

EmployeeServiceImpl.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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。那里少了什么?

EN

回答 2

Stack Overflow用户

发布于 2022-01-13 19:46:10

就像这里描述的一样。问题是,对于消费者(此处: EmployeeServiceImpl.java),提供程序的依赖性(此处: EmployeeServiceTest)缺失了。

在IntelliJ中最简单的解决方案是添加:

代码语言:javascript
复制
requires Provider

给消费者。然后就是:

右键单击->添加依赖项

之后,您可以移除提供程序的要求和

代码语言:javascript
复制
System.out.println(loader.iterator().hasNext());

应该打印真

票数 0
EN

Stack Overflow用户

发布于 2021-06-01 10:07:31

将注释@AutoService(EmployeeService.class)添加到EmployeeServiceImpl类中,如

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

.

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54098193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档