Java ServiceLoader未加载新服务
我的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
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