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

use*_*859 18 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)****
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

小智 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-> lib中
  2. 添加它给你重新构建路径
  3. 物理删除asm-4.0.jar
  4. 项目 - >属性 - >谷歌 - > AppEngine:将Datanuclueus切换到v1

而已!


Dad*_*boy 9

这篇文章的说明解决了我的问题.

显然,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版.


mar*_*amy 5

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


Tae*_*Kim 0

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

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

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