2016-07-25 6 views
0

왜 오류가 발생합니까? 어떻게 수정합니까? java.lang.LinkageError : 중복 클래스 정의 시도

[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) 

오류를

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

의 원인 그리고이가있는 라인입니다. 그것은 다른 모듈에서 왔고 둘 다 동시에 비동기 적으로 실행되어야합니다 (또는 지금 당장은 하나의 스레드 만 있다고 생각하기 때문에 서로가 짧게 실행되어야합니다). 이것은 오류없이 작동합니다.

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

Filters.eq는 정적 방법입니다.

내가 중요한 지식이 부족한 것 같은 기분
ExecutorService pool = Executors.newCachedThreadPool(); 

같은

를 사용하는,하지만 난 곳 RIT fo를 찾을 지 모른다.

+0

비정상적인 클래스 로딩 설정을 사용하고 있습니까? – immibis

+0

나는 MongoCharacter 클래스를위한 인터페이스와 MongoPlayer 클래스 (작동하는 코드의 클래스)와 비슷한 인터페이스를 사용하고있다. MongoCharacter 클래스가 문제가 되나요? 아니면 Mongo 드라이버를로드하는 데 문제가 있습니까? getPlayers()와 getCharacters()는 같은 MongoDatabase 클래스에서 파생 된 MongoCollection입니다. –

+0

@ImranAli 이것은 LinkageError의 하위 클래스가 아닙니다. 그것은 * LinkageError입니다. – EJP

답변

0

duplicate class definition for name 모두를 말합니다. 그것은 mongodb 드라이버를 다른 플러그인처럼 클래스 패스 com.mongodb.client 아래에 복사 한 것으로 보이며 동일한 서버에서 두 플러그인을 모두 실행하고있는 것으로 보입니다. 클래스 패스가 동일한 두 클래스를로드하려고하기 때문에 충돌이 발생합니다.

+0

ClassLoader 오류라고 생각합니다. DB 액세스를 단 하나의 모듈에만 적용하여이 오류를 수정했습니다. 그러나 나중에 모듈에 대한 종속성을 가진 다른 모듈이 모듈의 클래스 (async)를로드 할 때 내 자신의 클래스에서 동일한 문제가 발생했습니다. 지금 시작할 때 enum을 수동으로로드합니다. –