繁体   English   中英

如何使Java ClassLoader知道可用的类?

[英]How do I make the java ClassLoader aware of available classes?

我正在尝试为现有应用程序创建Java插件。 插件希望重用主应用程序中的许多现有代码库(例如,日志记录,错误处理等)。

我正在尝试将插件加载为.jar文件,如下所示:

String localPath = "...";
String pluginName = "...";

File jarFile = new File(localPath);
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()});

pluginLoader.loadClass(pluginName).newInstance();

我遇到的问题是,即使我的类存在于主应用程序中,也无法找到我想在插件内部导入的类,但是却出现如下错误:

NoClassDefFoundError: com/foo/exception/FooException
at com.foo.plugins.PluginManager.loadPlugin(PluginManager.java:187)
at com.foo.plugins.PluginManager.loadPlugins(PluginManager.java:86)
...

com/foo/exception/FooException在代码中随处可见,但我不想在插件jar文件中包含此类(以及许多其他类)。 相反,我希望ClassLoader以某种方式了解本地现有的类。 这可能吗? 如果是这样,我该怎么办?

您需要将主应用程序的类加载器用作父级:

ClassLoader mainLoader = ThisClass.class.getClassLoader(); // some class in the main application
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}, mainLoader);

然后由插件类加载器加载的类将有机会获得由主类加载器加载的类(以及那个类加载器的父,如果有的话,依此类推)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM