【发布时间】: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