2014-11-01 3 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.PluginDriver 클래스를로드 할 때 URLClassLoader이 필요한 다른 모든 클래스를로드하지 못했습니다. jar 파일에 모든 클래스를로드하여이 문제를 해결했습니다. jar 파일의 모든 클래스를 찾으려면 here 메서드를 사용했습니다.

관련 문제