我在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)****
任何帮助都将不胜感激。
答案 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 :(得分: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,它对我有用。