await method causing incompatibleClassChangeError: implementing class

await method causing incompatibleClassChangeError: implementing class

我正在使用 play-1.2.5。对于 async,我在我的控制器中使用 await() 方法。但是 await() 在我的应用程序启动期间导致 IncompatibleClassChangeError。我真的不明白原因。

当我评论 await() 行时,该错误消失了。

这是我的控制器操作:

public static void loadScheduledConfigs() {
    Future<JsonObject> future = Startup.THREAD_POOL.submit(new MyCallable());
    JsonObject object = null;
    /*
    I also tried this
        Future<JsonObject> future =  new FutureTask<JsonObject>( new MyCallable());
        JsonObject object =  await(future);
    */
    try{
        object = future.get(); 
    }catch(Exception e) {
        log.error(e.getMessage(), e);
    }
    renderJSON(object);
}

异常:

Oops: IncompatibleClassChangeError
An unexpected error occured caused by exception IncompatibleClassChangeError: Implementing class

play.exceptions.UnexpectedException: Unexpected Error
    at play.Invoker$Invocation.onException(Invoker.java:244) ~[play-1.2.5rc4.jar:na]
    at play.Invoker$Invocation.run(Invoker.java:286) ~[play-1.2.5rc4.jar:na]
    at Invocation.HTTP Request(Play!) ~[na:na]
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_07]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) ~[na:1.7.0_07]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_07]
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_07]
    at java.net.URLClassLoader.access0(URLClassLoader.java:71) ~[na:1.7.0_07]
    at java.net.URLClassLoader.run(URLClassLoader.java:361) ~[na:1.7.0_07]
    at java.net.URLClassLoader.run(URLClassLoader.java:355) ~[na:1.7.0_07]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_07]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_07]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) ~[na:1.7.0_07]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_07]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ~[na:1.7.0_07]
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_07]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) ~[na:1.7.0_07]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_07]
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_07]
    at java.net.URLClassLoader.access0(URLClassLoader.java:71) ~[na:1.7.0_07]
    at java.net.URLClassLoader.run(URLClassLoader.java:361) ~[na:1.7.0_07]
    at java.net.URLClassLoader.run(URLClassLoader.java:355) ~[na:1.7.0_07]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_07]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_07]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) ~[na:1.7.0_07]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_07]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ~[na:1.7.0_07]
    at play.classloading.enhancers.ContinuationEnhancer.enhanceThisClass(ContinuationEnhancer.java:74) ~[play-1.2.5rc4.jar:na]
    at play.CorePlugin.enhance(CorePlugin.java:297) ~[play-1.2.5rc4.jar:na]
    at play.plugins.PluginCollection.enhance(PluginCollection.java:551) ~[play-1.2.5rc4.jar:na]
    at play.classloading.ApplicationClasses$ApplicationClass.enhance(ApplicationClasses.java:235) ~[play-1.2.5rc4.jar:na]
    at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:167) ~[play-1.2.5rc4.jar:na]
    at play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:431) ~[play-1.2.5rc4.jar:na]
    at play.Play.start(Play.java:516) ~[play-1.2.5rc4.jar:na]
    at play.Play.detectChanges(Play.java:642) ~[play-1.2.5rc4.jar:na]
    at play.Invoker$Invocation.init(Invoker.java:198) ~[play-1.2.5rc4.jar:na]
    ... 1 common frames omitted

我不知道是我的编码方式有问题,还是某些依赖项冲突导致了这个问题。 (我检查了我的lib文件夹和我项目的classpath/dependencies,我没有发现任何冲突的库)

我得到了解决方案。 asm.jar 制造了问题。我正在使用 kryo 进行序列化。 kryo 和 play 都具有 asm.jar 作为依赖项。所以我的 class 路径中有两个不同版本的 asm.jar。一个是 kryo 自带的,另一个是 play framework 自带的。那引起了问题。

我删除了一个 asm.jar 并且那个异常消失了。