ServiceLoader 找不到从路径

问题描述

我一直在尝试使用 ServiceLoader 做一种插件系统。有2个模块,第一个提供抽象类LoadedRealmPlugin。第二个扩展了这个类。我已经添加了与ServiceProvider的全名对应的文件,并在其中添加了service-class。 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。我查看了 this post,但我不太确定如何应用该答案,因为我正在尝试从文件加载我的插件。另外,我发现了this post。然而,没有答案,只有一些似乎没有回答问题的评论

您可能已经知道,这是我第一次使用类加载器。如果需要任何其他信息,请询问我。感谢您阅读我的初学者烦恼。

解决方法

无包类位于未命名的包中,对于相当多的代码(尤其是此处包括的代码)无法访问

PluginExtension.java 放入一个包中,确保您的 META-INF/services/com.ic.mainmodule 文件的内容反映了这一点(内容应该是 pkg.PluginExtension),它会正常工作。