2012-08-28 5 views
17

Escribí un par de servicios REST utilizando Jersey 1.13 en JRE 1.6. Todo funciona bien localmente, pero después de implementarlo en GAE obtengo este error:java.lang.IncompatibleClassChangeError: implementando la implementación de clase en el motor de aplicación

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

Cualquier ayuda sería apreciada.

Respuesta

0

¿Has actualizado el SDK de tu App Engine? (Recientemente, el SDK del motor de la aplicación se actualizó de 1.7.0 a 1.7.1)

Intenta revertir el SDK de tu motor de aplicación a 1.7.0. He intentado muchas soluciones que encontré en Internet, ninguna de ellas funcionó para mí, pero esta funcionó.

No tengo idea de cómo puedo cambiar de forma segura la versión sdk de mi motor de aplicación por ahora. Si alguien sabe cómo cambiar la versión de SDK de la aplicación, házmelo saber.

3

Tal vez esto ayude: java.lang.IncompatibleClassChangeError: Implementing class Mongo

No es exactamente la misma clase, pero el problema se produce cuando tiene una biblioteca con 2 frascos de diferentes versiones. Asegúrese de que no incluyó ninguna biblioteca adicional o (explicaré lo que me sucedió):

Tiene A-1.0.jar y A-1.0.jar tiene dentro de otro jar, digamos B-1.0.jar , pero ha incluido por separado un B-2.0.jar y de esta manera los dos archivos de la versión B diferentes son el problema.

Asegúrate de que no has hecho esto.

1

¡El mismo problema aquí, pero creo que lo he solucionado!

El truco estaba ejecutando un interior limpio de Eclipse, que me notificó al siguiente error:

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 

El poco importante. . .

Causado por: org.datanucleus.exceptions.NucleusUserException: Usted parece tener v3 ASM en el CLASSPATH y que necesita ASM v4

Al parecer, GAE no le gusta tener dos versiones de ASM cargados. En un capricho, entré en las propiedades del proyecto eclipse y cambié la versión de datanucleus de v2 a v1. Volví a redibujar y ahora mi aplicación funciona. Tanto para atrapar este tipo de problemas en el entorno de desarrollo local. . .

Creo que pasé más tiempo configurando GAE para ejecutar con jersey de lo que realmente escribí la aplicación. Esta puede ser mi primera y última aplicación alojada GAE.

9

Las instrucciones en this post se ocuparon de mi problema.

Al parecer, la camiseta-servidor 1.13 JAR es compatible con asm3.1 y GAE 1.7.1 necesita ASM 4. Con la herramienta reenvasado Jar jarjar puede implementar un ASM 3,1 frasco que jugará con asm 4.

Es posible que necesite utilizar JarJar versión 1.3 si 1.4 da un mensaje de error.

+0

Gracias. Me salvaste mucho tiempo – Allwyn

+0

Eso funcionó para mí también. ¡¡¡Gracias a dios!!! –

35

Esta excepción se debe a problemas de compatibilidad entre asm-4.0.jar y asm-3.1.jar. Con la nueva Versión de AppEngine, se usa asm-4.0.jar y no es compatible con Jersey, que se basa en asm-3.1.jar. Para que Jersey siga trabajando en GAE 1.7, debe eliminar la dependencia de asm-4.0.jar.

Ver este post: http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

It s probado y verificado, así:

  1. complemento asm-3.3.1.jar a su guerra> lib
  2. agregarlo a que vuelva Vía de construcción
  3. eliminar físicamente el asm-4.0.jar
  4. Proyecto -> Propiedades -> Google -> AppEngine: cambiar Datanuclueus a v1

Eso es todo!

+0

Gracias, eso realmente me ahorró muchísimo tiempo. – eskalera

+0

Gracias 2 usted, nobrainer 4 me :) – jaanus

+0

+1. Simple y eficiente – Cassio

0

Tengo este error trabajando en un proyecto maven usando Jersey-1.11 para desarrollar un servicio REST: cglib-3.0 depende de asm-4.0, por lo que lo excluí, dejando asm-3.0 en reposo. Esto es porque la versión de Jersey que estoy usando usa 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> 
4

La nueva versión 1.18.1 Jersey doens't dependen de Asm 3, por lo que es compatible con GAE!

+0

después de medio día de navegación SO, esto finalmente lo resolvió. Thnx – Pega88

+0

jersey 1.19 también es bueno. –

0

Cambié la Persistencia de JAP2 a JPA1 y funcionó para mí.

Cuestiones relacionadas