从单独的JAR动态加载抽象类和实现

时间:2013-12-04 12:07:50

标签: java

我有一个java应用程序,它动态地从FS加载几个插件(.jar文件)。对于每个插件,我使用这样的代码:

URLClassLoader cl = URLClassLoader.newInstance( new URL[] { jarFile } );
Class<?> loadedClass = cl.loadClass( PluginEntry );
BasePlugin plugin = (basePlugin)loadedClass.newInstance();

一切都好。我有2个插件继承了同一个类,这里​​是一个结构:     interface BasePlugin - &gt; app.jar     抽象类BaseA实现BasePlugin - &gt; baseA.jar     B类延伸BaseA - &gt; pluginB.jar     C类延伸BaseA - &gt; pluginC.jar

但我需要将baseA包放到pluginB.jar和pluginC.jar中,这就是问题所在。我想要做的是从pluginB / C包中删除BaseA.jar并在加载pluginB和pluginC之前从FS动态加载BaseA.jar。 我试着这样做

URLClassLoader cl = URLClassLoader.newInstance( new URL[] { baseAjarFile } );
Class<?> loadedClass = cl.loadClass( PluginEntry );

但我无法对该loadedClass做任何事情。当App加载pluginB / C时,它失败并出现java.lang.NoClassDefFoundError异常。 那么如何加载这个常见的抽象基类并使其可用于pluginB / C?

1 个答案:

答案 0 :(得分:0)

尝试

URLClassLoader.newInstance( new URL[] { baseAjarFile }, cl);