web-dev-qa-db-fra.com

java.lang.IncompatibleClassChangeError: Implémentation du déploiement de classe sur le moteur d'application

J'ai écrit quelques services REST utilisant Jersey 1.13 sur JRE 1.6. Tout fonctionne correctement localement, mais après le déploiement sur GAE, le message d'erreur suivant s'affiche:

****Uncaught exception from servlet
Java.lang.IncompatibleClassChangeError: Implementing class
    at com.google.appengine.runtime.Request.process-139e1bda14d5aebc(Request.Java)
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClass(ClassLoader.Java:634)
    at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:142)
    at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:277)
    at Sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:616)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:266)
    at com.Sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.Java:79)
    at com.Sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.Java:104)
    at com.Sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.Java:78)
    at com.Sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.Java:89)
    at com.Sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.Java:700)
    at com.Sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.Java:678)
    at com.Sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.Java:203)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:374)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:557)
    at javax.servlet.GenericServlet.init(GenericServlet.Java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.Java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.Java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.Java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.Java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.Java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.Java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.Java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:50)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.Java:452)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.Java:458)
    at com.google.tracing.TraceContext.runInContext(TraceContext.Java:698)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.Java:336)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.Java:328)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.Java:456)
    at Java.lang.Thread.run(Thread.Java:679)****

Toute aide serait appréciée.

18
user1630859

Cette exception est due à des problèmes de compatibilité entre asm-4.0.jar et asm-3.1.jar. Avec la nouvelle version de AppEngine, asm-4.0.jar est utilisé et n'est pas compatible avec Jersey, qui s'appuie sur asm-3.1.jar. Pour que Jersey fonctionne toujours sur GAE 1.7, vous devez supprimer la dépendance sur asm-4.0.jar.

Voir cet article: http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-Java/

C’est testé et vérifié, comme ça:

  1. ajoutez asm-3.3.1.jar à votre war-> lib
  2. ajoutez-le à votre chemin de construction 
  3. enlever physiquement le asm-4.0.jar
  4. Projet -> Propriétés -> Google -> AppEngine: bascule Datanuclueus en v1

C'est tout!

36
youhammi

Les instructions sur ce post ont pris soin de mon problème.

Apparemment, le jar jersey-server 1.13 est compatible avec asm3.1 et GAE 1.7.1 requiert ASM 4 . À l'aide de l'outil de reconditionnement de jar, jarjar, vous pouvez déployer un jar asm 3.1 sur lequel asm 4 sera utilisé.

Vous devrez peut-être utiliser JarJar version 1.3 si la version 1.4 génère un message d'erreur.

9
Daddyboy

La nouvelle version 1.18.1 de Jersey ne dépend pas d’Asm3, elle est donc compatible avec GAE!

4
marcogramy

Peut-être que cela aidera: Java.lang.IncompatibleClassChangeError: classe d'implémentation Mongo

Ce n'est pas exactement la même classe, mais le problème survient lorsque vous avez une bibliothèque avec 2 jars de version différente. Assurez-vous de ne pas inclure de bibliothèques supplémentaires ou (j'expliquerai ce qui m'est arrivé):

Vous avez A-1.0.jar et A-1.0.jar a un autre fichier JAR, disons B-1.0.jar, mais vous avez inclus séparément un fichier B-2.0.jar et les deux fichiers JAR de la version B sont de cette manière .

Assurez-vous que vous n'avez pas fait cela.

3
sfat

Même problème ici, mais je crois que j'ai résolu le problème!

L'astuce consistait à exécuter un nettoyage à l'intérieur d'Eclipse, ce qui m'a signalé l'erreur suivante:

Java.lang.RuntimeException: Unexpected exception
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.Java:76)
    at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.Java:71)
    at com.google.appengine.tools.enhancer.Enhance.main(Enhance.Java:51)
Caused by: Java.lang.reflect.InvocationTargetException
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.Java:74)
    ... 2 more
Caused by: org.datanucleus.exceptions.NucleusUserException: You seem to have ASM v3 in the CLASSPATH and you need ASM v4
    at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.Java:173)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.Java:1133)
    ... 7 more

Le bit important. . .

Causée par: org.datanucleus.exceptions.NucleusUserException: Vous semblez avoir ASM v3 dans le CLASSPATH et vous avez besoin d'ASM v4

Apparemment, GAE n'aime pas avoir deux versions d'ASM chargées. Sur un coup de tête, je suis allé dans les propriétés du projet Eclipse et ai changé la version de datanucleus de v2 à v1. J'ai redéployé et maintenant mon application fonctionne. Nous en avons assez pour résoudre ce type de problèmes dans l’environnement de développement local. . . 

Je pense que j'ai passé plus de temps à configurer GAE pour utiliser un maillot qu'en écrivant l'application. Cela peut être ma première et dernière application hébergée GAE.

1
Chad Brogan

J'ai eu cette erreur en travaillant sur un projet maven utilisant Jersey-1.11 pour développer un service REST: En effet, la version Jersey que j'utilise utilise asm-3.0.

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.0</version>
    <exclusions>
        <exclusion>
            <artifactId>asm</artifactId>
            <groupId>org.ow2.asm</groupId>
        </exclusion>
    </exclusions>
</dependency>
0
eadjei

J'ai changé la persistance de JAP2 à JPA1 et cela a fonctionné pour moi.

0
Jehoshuah

Avez-vous mis à jour le SDK de votre moteur d'application? (Récemment, le SDK du moteur d'applications a été mis à jour de la version 1.7.0 à la version 1.7.1.)

Essayez de rétablir le Kit de développement logiciel (SDK) de votre moteur d'application en version 1.7.0. J'ai essayé de nombreuses solutions trouvées sur Internet, aucune ne fonctionnait pour moi, mais celle-ci fonctionnait.

Je ne sais pas comment je peux changer en toute sécurité la version sdk de mon projet de moteur d'application pour l'instant. Si quelqu'un sait comment changer la version SDK de l'application, veuillez me le faire savoir.

0
Taeho Kim