2016-07-25 7 views
0

Warum tritt der Fehler auf und wie behebe ich ihn?java.lang.LinkageError: doppelte Klassendefinition versucht

[02:13:02] [pool-4-thread-2/WARN]: Exception in thread "pool-4-thread-2" 
[02:13:02] [pool-4-thread-2/WARN]: java.lang.LinkageError: loader (instance of org/bukkit/plugin/java/PluginClassLoader): attempted duplicate class definition for name: "com/mongodb/client/model/Filters" 
[02:13:02] [pool-4-thread-2/WARN]: at java.lang.ClassLoader.defineClass1(Native Method) 
[02:13:02] [pool-4-thread-2/WARN]: at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 
[02:13:02] [pool-4-thread-2/WARN]: at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
[02:13:02] [pool-4-thread-2/WARN]: at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
[02:13:02] [pool-4-thread-2/WARN]: at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
[02:13:02] [pool-4-thread-2/WARN]: at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
[02:13:02] [pool-4-thread-2/WARN]: at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
[02:13:02] [pool-4-thread-2/WARN]: at java.security.AccessController.doPrivileged(Native Method) 
[02:13:02] [pool-4-thread-2/WARN]: at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
[02:13:02] [pool-4-thread-2/WARN]: at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) 
[02:13:02] [pool-4-thread-2/WARN]: at org.bukkit.plugin.java.JavaPluginLoader.getClassByName(JavaPluginLoader.java:195) 
[02:13:02] [pool-4-thread-2/WARN]: at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:97) 
[02:13:02] [pool-4-thread-2/WARN]: at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) 
[02:13:02] [pool-4-thread-2/WARN]: at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
[02:13:02] [pool-4-thread-2/WARN]: at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
[02:13:02] [pool-4-thread-2/WARN]: at me.franzsan.data.mongo.MongoCharacter.existsCharacter(MongoCharacter.java:109) 
[02:13:02] [pool-4-thread-2/WARN]: at me.franzsan.data.mongo.MongoCharacter.lambda$loadCharacter$0(MongoCharacter.java:44) 
[02:13:02] [pool-4-thread-2/WARN]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[02:13:02] [pool-4-thread-2/WARN]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[02:13:02] [pool-4-thread-2/WARN]: at java.lang.Thread.run(Thread.java:745) 

Das ist die Linie, die den Fehler

FindIterable cursor = connection.getCharacters().find(Filters.eq("uuid", uuid)); 

verursacht Und dann gibt es auch diese. Es ist von einem anderen Modul und beide sollten gleichzeitig asynchron ausgeführt werden (oder kurz hintereinander, weil ich denke, dass ich momentan nur einen Thread habe). Dieser funktioniert ohne Fehler.

FindIterable cursor = connection.getPlayers().find(Filters.eq("uuid", id)); 

Filters.eq ist eine statische Methode.

Beide sind mit den gleichen

ExecutorService pool = Executors.newCachedThreadPool(); 

Ich fühle mich wie ich entscheidendes Wissen fehle bin, aber ich habe keine Ahnung, wo fo rit zu suchen.

+0

Verwenden Sie ein ungewöhnliches Classloading-Setup? – immibis

+0

Ich benutze eine Schnittstelle für MongoCharacter-Klasse und eine sehr ähnliche für MongoPlayer-Klasse (die Klasse aus dem Code, der funktioniert). Ist die MongoCharacter-Klasse das Problem oder ist etwas falsch mit dem Laden des Mongo-Treibers? Sowohl getPlayers() als auch getCharacters() sind MongoCollection-s, die von derselben MongoDatabase-Klasse abgeleitet sind. –

+0

@ImranAli Dies ist keine Unterklasse von 'LinkageError'. Es ist * ein 'LinkageError'. – EJP

Antwort

0

duplicate class definition for name sagt alles. Es scheint, dass Sie den mongodb Treiber in Ihrem Plugin unter dem Klassenpfad wie in Ihrem anderen Plugin kopiert haben und Sie beide Plugins auf demselben Server laufen haben. Dies führt zu einem Konflikt, weil Sie versuchen, 2 Klassen mit genau demselben Klassenpfad zu laden.

+0

Ich denke, es ist ein ClassLoader-Fehler. Ich habe diesen Fehler behoben, indem ich den Datenbankzugriff nur in einem Modul anwendete. Aber später stieß ich auf das gleiche Problem mit meinen eigenen Klassen, als ein anderes Modul, das eine Abhängigkeit von einem Modul hatte, zuerst die Klasse dieses Moduls geladen hat (async). Ich lade diese Enumeration beim Start jetzt manuell –