如何解决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
),它会正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。