serviceloader找不到从路径加载的服务

hivapdat  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(779)

我一直在尝试使用serviceloader做一种插件系统。共有2个模块,第一个模块提供了抽象类loadedrealmplugin。第二个扩展了这个类。我已经添加了与serviceprovider的全名对应的文件,并向其中添加了服务类。intellij没有发现任何错误(但是在更改文件名或类名时会发现)。结构如下:

MainModule
   src
     main
       java
          com.interestingcompany.mainmodule
             LoadedRealmPlugin
  MainModule.iml

Plugin
  META-INF
      services
          com.interestingcompany.mainmodule (-> Content: "PluginExtension")
  src
     PluginExtension
  Plugin.iml

(这很简单,我遗漏了(我认为)对serviceloader不重要的类。如果有人需要,我可以发布实际结构的截图)
下面是我用来加载服务的代码:

File file = new File("Plugins/Plugin.jar");
URLClassLoader c = new URLClassLoader(new URL[]{file.getAbsoluteFile().toURI().toURL()});
ServiceLoader<LoadedRealmPlugin> loader = ServiceLoader.load(LoadedRealmPlugin.class, c);
LoadedRealmPlugin p = loader.iterator().next(); // Throws a java.util.NoSuchElementException
p.Initialize(RealmPath); // Abstract method implemented in the service
return p;

当尝试运行它时,我总是得到一个空的serviceloader。我看了这篇文章,但我不太清楚如何应用这个答案,因为我试图从一个文件加载我的插件。另外,我发现了这个帖子。然而,没有答案,只有一些似乎没有回答问题的评论。
正如您可能已经知道的,这是我第一次使用类加载器。如果有任何其他需要的信息,只要问我。谢谢你通读我的初学者烦恼。

7bsow1i6

7bsow1i61#

没有包的类在未命名包中,很多代码都无法访问它,尤其是这里。
PluginExtension.java 在一个包中,确保 META-INF/services/com.ic.mainmodule 文件反映了这一点(内容应该是 pkg.PluginExtension ),会很好的。

相关问题