java.lang.IncompatibleClassChangeError:实现类部署到应用程序引擎

我在JRE 1.6上使用Jersey 1.13编写了几个REST服务。 一切运行良好本地,但是我部署到GAE后,我得到这个错误:

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

任何帮助,将不胜感激。

这个exception是由asm-4.0.jar和asm-3.1.jar之间的兼容性问题引起的。 使用新版本的AppEngine,使用了asm-4.0.jar,它与依赖于asm-3.1.jar的Jersey不兼容。 为了使泽西仍然在GAE 1.7上工作,你必须去除对asm-4.0.jar的依赖。

看到这个post: http : //cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

它经过testing和validation,如下所示:

  1. 添加asm-3.3.1.jar到你的war-> lib
  2. 把它添加到你重buildpath
  3. 从物理上删除asm-4.0.jar
  4. 项目 – >属性 – > Google – > AppEngine:将Datanuclueus切换到v1

而已!

这篇文章的指示照顾我的问题。

显然,泽西服务器1.13 jar是与asm3.1兼容的,而GAE 1.7.1需要ASM 4.使用jar重新打包工具jarjar,你可以部署一个asm 3.1 jar,可以和asm 4一起玩。

如果1.4给出错误信息,您可能需要使用JarJar版本1.3。

新泽西版本1.18.1不依赖于Asm 3,所以它与GAE兼容!

也许这将帮助: java.lang.IncompatibleClassChangeError:实现类Mongo

这不是完全相同的类,但是当你有一个库有两个不同版本的jar子时会出现问题。 确保你没有包括任何额外的库或(我会解释发生了什么事):

你有A-1.0.jar和A-1.0.jar在另一个jar里面,比方说B-1.0.jar,但是你已经分别包含了一个B-2.0.jar,这样两个不同版本的B jar就是问题了。

确保你没有做到这一点。

同样的问题在这里,但我相信我已经修好了!

诀窍是在eclipse中运行一个干净的,它通知我以下错误:

 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 

重要的一点。 。 。

导致:org.datanucleus.exceptions.NucleusUserException:您似乎有CLASSPATH中的ASM v3,您需要ASM v4

显然,GAE不喜欢加载两个版本的ASM。 一时兴起,我进入了eclipse项目的属性,并将数据核心版本从v2更改为v1。 我重新部署了,现在我的应用程序工作。 在本地开发环境中捕捉这些问题非常多。 。 。

我想我花了更多的时间configurationGAE运行jersey比我实际上编写应用程序。 这可能是我第一次和最后一个GAE托pipe的应用程序。

你有没有更新你的App引擎的SDK? (最近App引擎SDK从1.7.0更新到1.7.1。)

尝试将您的应用引擎的SDK恢复到1.7.0。 我已经尝试了很多我在互联网上find的解决scheme,但都没有为我工作,但这个工作。

我不知道我现在可以如何安全地更改我的应用程序引擎项目的SDK版本。 如果有人知道如何更改应用程序的SDK版本,请让我知道。

我得到了一个使用Jersey-1.11开发一个REST服务的maven项目的错误:cglib-3.0依赖于asm-4.0,所以我排除了它,让asm-3.0站起来。 这是因为我使用的Jersey版本使用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> 

我将持久性从JAP2更改为JPA1,并为我工作。