2016-04-23 5 views
0

Ich mache ein Modul für ein Plugin. Die Hauptanwendung lädt das Plugin, welches dann die Module für mein Plugin lädt (Hauptanwendung --Loads Plugins -> Mein Plugin --Loads Module -> Mein Modul).Verwendung der wichtigsten jar Methoden aus dynamisch geladenen jar

Ich habe ein Jar (wir nennen es dynamicJar), ​​die ich dynamisch in mein Plugin geladen werde. Das Problem, das ich habe, ist, wenn ich Methoden und Klassen von meinem Plugin verwenden möge in dynamicJar ich einen NoClassDefFound Fehler:

Caused by: java.lang.NoClassDefFoundError: me/venom/crates/objects/crates/Crate 
at me.venom.csgo.CSGOCrate.runCSGO(CSGOCrate.java:135) ~[CSGOCrates.jar:?] 
at me.venom.crates.CSGOHelper.runCSGO(CSGOHelper.java:58) ~[?:?] 
at me.venom.crates.PListener.onChestInteract(PListener.java:194) ~[?:?] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_75] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_75] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_75] 
at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_75] 
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.9.jar:git-Spigot-1480adb-8b61cc5] 
... 17 more 
Caused by: java.lang.ClassNotFoundException: me.venom.crates.objects.crates.Crate 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) ~[?:1.7.0_75] 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[?:1.7.0_75] 
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.7.0_75] 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[?:1.7.0_75] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) ~[?:1.7.0_75] 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[?:1.7.0_75] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ~[?:1.7.0_75] 
at me.venom.csgo.CSGOCrate.runCSGO(CSGOCrate.java:135) ~[CSGOCrates.jar:?] 
at me.venom.crates.CSGOHelper.runCSGO(CSGOHelper.java:58) ~[?:?] 
at me.venom.crates.PListener.onChestInteract(PListener.java:194) ~[?:?] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_75] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_75] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_75] 
at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_75] 
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.9.jar:git-Spigot-1480adb-8b61cc5] 
... 17 more 

Das Problem ist, dass ich Methoden aus der Hauptanwendung innerhalb des dynamicJar laufen kann, aber ich kann die Methoden aus dem Plugin nicht innerhalb von dynamicJar verwenden.

TL; DR: Die Verwendung von Klassen aus dem Plug-in-Jar löst eine ClassNotFoundException und NoClassDefFoundError aus, wenn sie aus einem dynamisch geladenen jar verwendet werden.

EDIT:

Hier ist der Code, den ich die Gläser in meine Klasse Pfad zu laden verwenden.

Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class}); 
    method.setAccessible(true); 
    method.invoke(ClassLoader.getSystemClassLoader(), new Object[]{file.toURI().toURL()}); 
+0

Das ist Geruch wie ein ClassLoader Problem, Sie müssen Ihren Code bereitstellen, sonst wird es schwer zu helfen –

+0

@NicolasFilotto Bearbeitete den Hauptpost mit dem Code –

+0

Sie definieren Ihre Plugins und Ihre Module mit dem System ClassLoader? –

Antwort

0

Ich löste das Problem, indem die Klassen in den Klassenlader des Plug-Ins laden, statt seiner eigenen Klassenlader oder dem Systemklassenlader. Funktioniert jetzt einwandfrei.

+0

Glücklich zu wissen, dass Sie die Antwort selbst finden könnten –