Search code examples
javaplayframeworkplayframework-1.x

await method causing incompatibleClassChangeError: implementing class


I'm using play-1.2.5. For async I'm using await() method in my controller. but that await() causing IncompatibleClassChangeError during my application startup. I really don't understand the reason.

when I comment await() line, that error gone away.

here is my Contoller action:

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);
}

Exception:

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.access$100(URLClassLoader.java:71) ~[na:1.7.0_07]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_07]
    at java.net.URLClassLoader$1.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.access$100(URLClassLoader.java:71) ~[na:1.7.0_07]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_07]
    at java.net.URLClassLoader$1.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

I don't know either problem is in the way I code, or some dependencies comflict causing this issue. (I checked my lib folder and classpath/dependencies of my project, I did not find any conflicting library)


Solution

  • I got the solution. it's asm.jar who was creating issue. I'm using kryo for serialization. kryo and play both has asm.jar as a dependency. So i have two different version of asm.jar in my class path. one that comes with kryo and other one that comes with play framework. that was causing issue.

    I removed one asm.jar and that exception gone away.