2013-12-04 2 views
0

У меня есть приложение java, которое динамически загружает несколько плагинов (.jar-файлов) из FS. Для каждого плагина я использую такой код:Динамически загружать абстрактный класс и реализацию из отдельных JAR

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

И все в порядке. У меня есть 2 плагина, которые наследуют один и тот же класс, вот структура: интерфейс BasePlugin -> app.jar абстрактный класс BaseA реализует BasePlugin -> baseA.jar класс B расширяет BaseA -> pluginB.jar класс C расширяет BaseA - > pluginC.jar

Но мне нужно поместить пакет baseA в pluginB.jar и pluginC.jar, и это проблема. Я хочу удалить BaseA.jar из пакетов pluginB/C и динамически загружать BaseA.jar из FS перед загрузкой pluginB и pluginC. Я пытался сделать это

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

, но я ничего не могу с этим сделать loadedClass. И когда приложение загружает плагинB/C, он выходит из строя с исключением java.lang.NoClassDefFoundError. Итак, как я могу загрузить этот общий абстрактный базовый класс и сделать его доступным для pluginB/C?

ответ

0

Попробуйте

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

Спасибо, это работает! – user3017277

Смежные вопросы