18

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

任何帮助,将不胜感激。

4

8 回答 8

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. 项目 -> 属性 -> Google -> AppEngine:将 Datanuclueus 切换到 v1

而已!

于 2012-11-25T15:50:37.307 回答
9

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

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

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

于 2012-09-03T02:16:53.903 回答
4

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

于 2014-05-08T13:37:33.680 回答
3

也许这会有所帮助:java.lang.IncompatibleClassChangeError:实现类 Mongo

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

你有 A-1.0.jar 和 A-1.0.jar 在另一个 jar 中,比如说 B-1.0.jar,但是你已经单独包含了一个 B-2.0.jar,这样两个不同版本的 B jar 就是问题所在.

确保你没有这样做。

于 2012-08-29T13:08:36.777 回答
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 上运行 jersey 的时间比我实际编写应用程序的时间还要多。这可能是我的第一个也是最后一个 GAE 托管应用程序。

于 2012-08-29T15:08:42.040 回答
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>
于 2013-10-31T16:24:44.300 回答
0

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

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

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

于 2012-08-29T12:25:10.433 回答
0

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

于 2015-02-04T05:59:28.007 回答