Java 从单独的JAR动态加载抽象类和实现
我有一个java应用程序,它动态地从FS加载几个插件(.jar文件)。对于每个插件,我都使用以下代码:Java 从单独的JAR动态加载抽象类和实现,java,Java,我有一个java应用程序,它动态地从FS加载几个插件(.jar文件)。对于每个插件,我都使用以下代码: URLClassLoader cl = URLClassLoader.newInstance( new URL[] { jarFile } ); Class<?> loadedClass = cl.loadClass( PluginEntry ); BasePlugin plugin = (basePlugin)loadedClass.newInstance(); URLClas
URLClassLoader cl = URLClassLoader.newInstance( new URL[] { jarFile } );
Class<?> loadedClass = cl.loadClass( PluginEntry );
BasePlugin plugin = (basePlugin)loadedClass.newInstance();
URLClassLoader cl=URLClassLoader.newInstance(新URL[]{jarFile});
类loadedClass=cl.loadClass(插件);
BasePlugin=(BasePlugin)loadedClass.newInstance();
一切都好。我有两个插件继承同一个类,下面是一个结构:
接口BasePlugin->app.jar
抽象类BaseA实现BasePlugin->BaseA.jar
B类扩展BaseA->pluginB.jar
C类扩展BaseA->pluginC.jar
但是我需要给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 );
URLClassLoader cl=URLClassLoader.newInstance(新URL[]{baseAjarFile});
类loadedClass=cl.loadClass(插件);
但是我不能用这个loaded类做任何事情。当应用程序加载pluginB/C时,它会失败,出现java.lang.NoClassDefFoundError异常。
那么,如何加载这个公共抽象基类并使其可用于pluginB/C呢?试试看
URLClassLoader.newInstance( new URL[] { baseAjarFile }, cl);