2014-11-01 4 views
0

В настоящее время я работаю над проектом, который предназначен для приема плагинов. Чтобы загрузить плагины из своего файла jar, я использую ClassLoader. Это код, который я использую для загрузки плагинов.Невозможно загрузить классы в файл jar

URLClassLoader loader = URLClassLoader.newInstance(new URL[] {pluginJar.toURI().toURL()},  this.getClass().getClassLoader()); 
    try { 
     Class<?> clazz= Class.forName("msciplugin.PluginDriver", true, loader); 

     Constructor<?> constructor=clazz.getConstructor(ProgramManager.class); 
     MSCIPlugin plugin=(MSCIPlugin) constructor.newInstance(programManager); 

     plugins.add(plugin); 
     plugin.addMSCIPluginListener(this); 
     this.pluginAdded(plugin); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
loader.close(); 

Когда я запускаю программу, я могу загрузить тестовый плагин, который я создал, но позже в программе, я прошу плагин выполнить операцию, которая использует класс из плагина банки, который был первоначально не используется. Затем программа бросает NoClassDefFoundError вызванная ClassNotFoundException

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: msciplugin/TimeUtils 
    at msciplugin.ServerControllerConfigurationWindow.refreashEditor(ServerControllerConfigurationWindow.java:195) 
    at msciplugin.ServerControllerConfigurationWindow.valueChanged(ServerControllerConfigurationWindow.java:299) 
    at javax.swing.JList.fireSelectionValueChanged(Unknown Source) 
    at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) 
    at javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown Source) 
    at javax.swing.JList.setSelectionInterval(Unknown Source) 
    at javax.swing.plaf.basic.BasicListUI$Handler.adjustSelection(Unknown Source) 
    at javax.swing.plaf.basic.BasicListUI$Handler.mousePressed(Unknown Source) 
    at java.awt.AWTEventMulticaster.mousePressed(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$400(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: msciplugin.TimeUtils 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.net.FactoryURLClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 45 more 

Любая помощь будет высоко оценен.

ответ

0

Я понял, в чем проблема. При загрузке класса msciplugin.PluginDriverURLClassLoader не загружал все остальные классы, которые были бы необходимы. Я решил эту проблему, загрузив все классы в файл jar. Я использовал метод here, чтобы найти все классы в файле jar.

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