gpt4 book ai didi

java.util.ServiceLoader 没有加载我的提供者类

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:28 36 4
gpt4 key购买 nike

我正在尝试将一个基本的基于 SPI 的处理程序注册表放在一起,我从 HandlerRegistry 中查找它。当我使用 ServiceLoader.load(Handler.class) 初始化提供程序,然后迭代列表以延迟加载它们时,我没有看到该类的任何实例。为了尽可能简单,我的 HandlerRegistry 类是:

public class HandlerRegistry 
{
private static HandlerRegistry registry;

private ServiceLoader<Handler> handlerLoader;

private HandlerRegistry()
{
handlerLoader = ServiceLoader.load(Handler.class);
}

public static synchronized HandlerRegistry getRegistry()
{
if (registry == null) {
registry = new HandlerRegistry();
registry.init();
}
return registry;
}

private void init()
{
System.out.println("HandlerRegistry.init()");
}

public Handler lookup(String item)
{
System.out.println("lookup("+item+")");
try {
Iterator<Handler> it = handlerLoader.iterator();
while (it.hasNext()) {
Handler handler = it.next();
System.out.println("found handler "+handler);
}
}
catch (ServiceConfigurationError err) {
err.printStackTrace();
}
return null;
}
}

我有一个 com.example.handler.Handler 接口(interface)(为简单起见,现在为空),以及一个实现该接口(interface)的 com.example.handler.handlers.DummyHandler 类。我在我的 jar 中创建了一个名为 META-INF/services/com.example.handler.Handler 的文件,其中包含单行

com.example.handler.handlers.DummyHandler

根据 javadoc。我的单元测试只是调用 lookup() 方法来验证查找项目的处理程序。当然,最终需要进行某种检查以查看这是否是该项目的正确处理程序,但此时我什至没有看到注册表加载了我的 DummyHandler 类。我在这里做错了什么吗?

谢谢!

最佳答案

答案似乎在于对其配置方式的敏感性。我一直将我的提供者名称资源文件(名为 com.example.handler.Handler 的文件)直接放在顶级项目目录中,即/resources/META-INF/services/com.example.handler.Handler。我已经配置了我的 build.gradle 来拉出文件并将其放入 jar 中:

jar { from('resources') { include 'META-INF/services/*.*' } }

当我检查 jar 文件时,文件就在那里,就在我预期的位置,所以我认为一切都很好。一脚,我碰巧把资源文件夹从下面移到 src/main 下,然后转瞬即逝!有用。我检查了 jar 文件,它看起来与以前的方式构建的文件相同,但出于某种原因,这个文件有效。如果我能确定差异,我会进一步更新,但至少我的测试用例现在可以工作了。

关于java.util.ServiceLoader 没有加载我的提供者类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105146/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com