【问题标题】:ServiceLoader not loading new servicesServiceLoader 未加载新服务
【发布时间】:2016-10-06 11:19:09
【问题描述】:

我的 ServiceLoader 不想加载我的新服务。我想我已经正确设置了一切。

Core.Main

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");
  }
}

Core.service.IService

package service;

public interface IService {
    String sayHi();
}

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

我有什么问题吗?

【问题讨论】:

  • 直接调用服务是否有效?如果不是,你可能有一个类路径问题。
  • 我不知道该怎么做,因为 DbDataBuilder 需要依赖 Core(Iservice 接口),如果我想从 Core 调用 DbDataBuilder,我需要 DBDataBuilder 依赖,但它是循环依赖和它不想编译。所以我不能直接调用它。
  • 您是否尝试过像您发布的那样简单的实现?请注意,如果您一次性编译类,那么这种循环依赖就不是什么大问题。可能是服务加载器只是看不到服务,因此直接调用测试。
  • 向 Main.java 添加以下行:Class.forName("builder.DbDataBuilder") 我希望你会得到 ClassNotFoundException,这将证明构建器在类路径中不可见,因此 ServiceLoader 无法找到
  • ServiceLoader 在构建器在运行时位于类路径上时很有用,而不是在编译时。您应该将具有编译范围依赖的第三个模块添加到Core,并将运行时范围依赖添加到DbDataBuilder,将Main 移动到第三个模块并享受ServiceLoader 功能

标签: java maven module serviceloader


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2023-03-18
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多