我有一个ServiceLoader,它试图加载任何扩展插件的东西。它找不到任何东西,即使我已经设置了服务文件。
源代码(类为com.otabi.firestar.pajamatale.plugin.loader.PluginFinder):https://github.com/firestar115/PajamaTale
插件:https://github.com/firestar115/PajamaTest
我在这里做错了什么?为什么插件不显示并打印"Test Kappa"?
发布于 2017-04-04 16:18:48
我可以确认URLClassLoader需要为每个代表Plugin的jar提供一个URL。使用URL将类加载器实例化到包含jar文件的目录是不够的。所以你需要做的是:
File[] pluginFiles = directory.listFiles((File dir, String name) -> name.endsWith(".jar"));
List<URL> urlsList = new ArrayList<>();
for (File file : pluginFiles) {
try {
urlsList.add(file.toURI().toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
URLClassLoader classLoader = URLClassLoader.newInstance(urlsList.toArray(new URL[]{}), Thread.currentThread().getContextClassLoader());然后,ServiceLoader将能够找到您的插件。
发布于 2016-06-30 02:54:19
您需要创建一个URLClassLoader实例,您需要提供包含插件的目录的url,并将上下文ClassLoader作为父ClassLoader (我的意思是Thread.currentThread().getContextClassLoader()),并使用ServiceLoader.load(Plugin.class, myURLClassLoader)而不是内部使用上下文ClassLoader的ServiceLoader.load(Plugin.class),这在您的情况下是不够的,因为您的插件不在您的类路径中。
类似于:
ClassLoader myURLClassLoader = new URLClassLoader(
new URL[]{new File("plugins").toURI().toURL()},
Thread.currentThread().getContextClassLoader()
);
ServiceLoader<Plugin> loader = ServiceLoader.load(Plugin.class, myURLClassLoader);https://stackoverflow.com/questions/38107830
复制相似问题