[英]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.