2017-07-04 1 views
0

Lassen Sie uns sagen, ich habe eine Hauptklasse App, die alle Gläser im Unterverzeichnis lädt Plugins mit einem URLClassLoader:Java Laden JAR dynamisch: NoClassDefFoundError

public class App(){ 
    public static void main(String[] args){ 
     for(File f : new File("plugins").listFiles()){ 
       URL[] urls = { new URL("jar:file:" + "plugins/" + f.getName() + ".jar" + "!/") }; 
       URLClassLoader cl = URLClassLoader.newInstance(urls); 

       Class<?> clazz = cl.loadClass(f.getName().toLowerCase()+"."+f.getName()); 
       cl.close(); 
       Plugin p = ((Plugin) clazz.newInstance()); 
     } 
    } 
} 

Alle diese Gläser eine Klasse enthalten, die eine Schnittstelle implementiert Plugin.

+-- Main.jar 
| +-- App.class 
| +-- Plugin.class 
| 
+-- Plugins/ 
| +-- PluginTest.jar 
|   +-- plugintest 
|    +-- PluginTest.class 
|    +-- Two.class 

Das funktioniert alles gut, wenn ich meinen Code nur in der PluginTest-Klasse schreibe. Aber sobald ich versuchen, zuzugreifen Zwei von PluginTest, erhalte ich einen großen Fehler:

Exception in thread "Thread-4" java.lang.NoClassDefFoundError: plugintest/Two 
[...] 

Wie soll ich richtig die die Klasse laden? Brauche Hilfe! Vielen Dank.

+0

Haben Sie einen kanonischen Namen, z. '" pluggtest.PluginTest "'? – m0skit0

Antwort

1

Schließen Sie Ihren Classloader nicht.

Entfernen cl.close(); Anweisung.

+0

Wow. So einfach. Ich kann es einfach nicht glauben, aber es funktioniert. Danke für die tolle schnelle Hilfe !!! – Galveston01

Verwandte Themen