我一直在尝试使用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。我看了这篇文章,但我不太清楚如何应用这个答案,因为我试图从一个文件加载我的插件。另外,我发现了这个帖子。然而,没有答案,只有一些似乎没有回答问题的评论。
正如您可能已经知道的,这是我第一次使用类加载器。如果有任何其他需要的信息,只要问我。谢谢你通读我的初学者烦恼。
1条答案
按热度按时间7bsow1i61#
没有包的类在未命名包中,很多代码都无法访问它,尤其是这里。
放
PluginExtension.java
在一个包中,确保META-INF/services/com.ic.mainmodule
文件反映了这一点(内容应该是pkg.PluginExtension
),会很好的。