【问题标题】:java.lang.IncompatibleClassChangeError: Implementing class deploying to app enginejava.lang.IncompatibleClassChangeError:实现类部署到应用引擎
【发布时间】:2012-08-23 09:09:16
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: google-app-engine jersey


    【解决方案1】:

    此异常是由 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->lib
    2. 将其添加到您的重新构建路径中
    3. 物理删除 asm-4.0.jar
    4. 项目 -> 属性 -> Google -> AppEngine:将 Datanuclueus 切换到 v1

    就是这样!

    【讨论】:

    • 谢谢,这真的为我节省了大量时间。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。你为我节省了很多时间
    【解决方案3】:

    New Jersey 版本 1.18.1 不依赖于 Asm 3,因此与 GAE 兼容!

    【讨论】:

    • SO浏览了半天,终于解决了。谢谢
    【解决方案4】:

    也许这会有所帮助: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 jar是问题。

    确保这不是你做的。

    【讨论】:

      【解决方案5】:

      同样的问题,但我相信我已经解决了!

      诀窍是在 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 托管应用程序。

      【讨论】:

        【解决方案6】:

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

        尝试将您的应用引擎的 SDK 恢复为 1.7.0。我尝试了许多在 Internet 上找到的解决方案,但没有一个对我有用,但这个有效。

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我将 Persistence 从 JAP2 更改为 JPA1,它对我有用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-15
              • 2016-01-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-08
              • 1970-01-01
              相关资源
              最近更新 更多