【问题标题】:Service Loader Class In Java, Having Issue with META-INF/services folderJava 中的服务加载程序类,META-INF/services 文件夹有问题
【发布时间】:2021-10-29 22:31:05
【问题描述】:

我被困在服务加载器类(java)中,任何人都可以帮忙,这是我的代码和附带的图片。 查看图片以完全理解并告诉我问题出在哪里

接口代码

package ServiceLoader_.SL;

interface Account {
    String getMessage();
}

实现该接口的类

package ServiceLoader_.SL;

public class Message implements Account {

    @Override
    public String getMessage() { 
        return "Hello";
    }
}

主类

package ServiceLoader_.SL;

import java.util.ServiceLoader;

public class main {
    public static void main(String[] args) {
        ServiceLoader<Account> ac = ServiceLoader.load(Account.class);
        Account ab = ac.iterator().next();
        if(ac.iterator().hasNext()){
            System.out.println("hay^");
        }
    }
}

在尝试访问 ac.iterator().next() 时给出没有找到此类元素的错误

点击 Here查看图片

【问题讨论】:

  • META-INF 必须位于类路径根目录中,因此它必须是 ServiceLoader_ 的兄弟。
  • 使用Iterator的一般方法是调用hasNext() 之前 next()。并且在同一个迭代器上,而不是调用iterator() 两次。

标签: java service loader serviceloader


【解决方案1】:

ServiceLoader 的文档所指定,provider-configuration 文件 必须是类路径的一部分,ServiceLoader&lt;Account&gt; 将被解析为

META-INF/services/ServiceLoader_.SL.Account

根据我可以从图片中推断出的内容,您的文件似乎位于

ServiceLoader_/META-INF/services/ServiceLoader_.SL.Account

ServiceLoader 实现不知道,因此它不会定位(因此不提供)实现类ServiceLoader_.SL.Message

要解决此问题,您必须将 META-INF 移动到类路径根目录。由于我不认识图像中显示的 IDE,但我不能说如何做到这一点。

【讨论】:

  • 问题是我没有将 META-INF 设置为资源,这样做之后它工作得很好。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2014-09-08
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多