java.lang.IncompatibleClassChangeError:实现类部署到app引擎的类

时间:2012-08-28 19:41:09

标签: google-app-engine jersey

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

任何帮助都将不胜感激。

8 个答案:

答案 0 :(得分:36)

此异常是由asm-4.0.jar和asm-3.1.jar之间的兼容性问题引起的。使用新版本的AppEngine,使用asm-4.0.jar,它与依赖于asm-3.1.jar的Jersey不兼容。为了使Jersey仍然适用于GAE 1.7,你必须删除对asm-4.0.jar的依赖。

请参阅此帖子:http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

经过测试和验证,就像那样:

  1. 将asm-3.3.1.jar添加到你的war-&gt; lib
  2. 将其添加到您的构建路径
  3. 以物理方式移除asm-4.0.jar
  4. 项目 - &gt;属性 - &gt; Google - &gt; AppEngine:将Datanuclueus切换到v1
  5. 就是这样!

答案 1 :(得分:9)

this post上的说明解决了我的问题。

显然,jersey-server 1.13 jar与asm3.1兼容,GAE 1.7.1需要ASM 4。 使用jar重新打包工具jarjar,你可以部署一个asm 3.1 jar,它将与asm 4一起玩。

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

答案 2 :(得分:4)

新泽西版1.18.1依赖于Asm 3,因此它与GAE兼容!

答案 3 :(得分:3)

也许这会有所帮助:java.lang.IncompatibleClassChangeError: Implementing class Mongo

它不是完全相同的类,但是当你有一个包含2个不同版本jar的库时会出现问题。确保你没有包含任何额外的库或(我将解释发生在我身上的事情):

你有A-1.0.jar和A-1.0.jar在另一个jar里面,让我们说B-1.0.jar,但你已经单独包含了一个B-2.0.jar,这样两个不同版本的B罐就是问题。

确保你没有这样做。

答案 4 :(得分:1)

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

诀窍是在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项目属性,并将datanucleus版本从v2更改为v1。我重新部署,现在我的应用程序工作。在本地开发环境中捕获这些问题非常重要。 。 。

我认为我花了更多的时间来配置GAE来运行泽西,而不是实际编写应用程序。这可能是我的第一个也是最后一个GAE托管应用。

答案 5 :(得分:0)

您是否更新了App引擎的SDK? (最近App引擎SDK已从1.7.0更新到1.7.1。)

尝试将应用引擎的SDK恢复为1.7.0。我尝试过很多在互联网上找到的解决方案,但没有一个能为我工作,但是这个解决方案很有效。

我不知道如何才能安全地更改我的应用引擎项目的sdk版本。如果有人知道如何更改应用程序的SDK版本,请告诉我。

答案 6 :(得分:0)

我在使用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>

答案 7 :(得分:0)

我将持久性从JAP2更改为JPA1,它对我有用。