Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServiceLoader未加载新服务_Java_Maven_Module_Serviceloader - Fatal编程技术网

Java ServiceLoader未加载新服务

Java ServiceLoader未加载新服务,java,maven,module,serviceloader,Java,Maven,Module,Serviceloader,我的ServiceLoader不想加载我的新服务。我想我把一切都安排好了 核心,主要 public class Main { public static void main(String[] args) { System.out.println("Before"); Iterator<IService> services = ServiceLoader.load(IService.class).iterator(); while (servic

我的ServiceLoader不想加载我的新服务。我想我把一切都安排好了

核心,主要

public class Main {
  public static void main(String[] args) {
      System.out.println("Before");
      Iterator<IService> services = ServiceLoader.load(IService.class).iterator();
      while (services.hasNext()) {
          IService service = services.next();
          System.out.println(service.sayHi());
      }
      System.out.println("After");
  }
}
DbDataBuilder.builder.DbDataBuilder

package builder;

import service.IService;
public class DbDataBuilder implements IService {

    public DbDataBuilder() {
    }

    public String sayHi() {
        return "I am Data Builder";
    }
 }
META-INF/services/service.Iservice

builder.DbDataBuilder

但当我运行它时,控制台输出是:

Before
After

我有什么问题吗?

当生成器在运行时而不是编译时位于类路径上时,ServiceLoader很有用。您应该将具有编译范围依赖关系的第三个模块添加到核心,将运行时范围依赖关系添加到DbDataBuilder,将Main移到第三个模块,并享受ServiceLoader功能

直接调用服务时,它是否起作用?如果不是,你可能有一个类路径问题。我不知道怎么做,因为DbDataBuilder需要对核心的依赖(Iservice接口),如果我想从核心调用DbDataBuilder,我需要DbDataBuilder依赖,但它是一个循环依赖,不想编译。所以我不能直接调用它。你有没有尝试过像你发布的那样简单的实现?请注意,如果一次性编译类,那么这种循环依赖关系就不是什么大问题。这可能是因为服务加载器没有看到服务,因此使用直接调用进行了测试。在Main.java中添加以下行:
Class.forName(“builder.DbDataBuilder”)
我希望您将得到ClassNotFoundException,这将证明builder在类路径上不可见,因此,当生成器在运行时而不是编译时位于类路径上时,ServiceLoaderServiceLoader很有用。您应该将具有编译范围依赖关系的第三个模块添加到
Core
中,并将运行时范围依赖关系添加到
DbDataBuilder
,将
Main
移动到第三个模块中,并享受ServiceLoader功能
Before
After