2012-08-28 64 views
17

我写了一对夫妇对JRE 1.6使用泽西1.13 REST服务。一切运行良好本地,但后我部署到GAE我得到这个错误:java.lang.IncompatibleClassChangeError:实现类部署到应用程序引擎

****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

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

尝试恢复您的应用程序引擎的SDK 1.7.0。我尝试了很多我在互联网上找到的解决方案,但他们都没有为我工作,但这个工作。

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

3

也许这将帮助:java.lang.IncompatibleClassChangeError: Implementing class Mongo

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

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

确保你没有做到这一点。

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项目属性并将数据核版本从v2更改为v1。我重新部署了,现在我的应用程序工作。非常适合在本地开发环境中捕捉这些类型的问题。 。 。

我想我花更多的时间配置GAE与球衣跑的比我实际编写应用程序。这可能是我第一次和最后一次GAE托管的应用程序。

9

this post的说明了我的问题的关心。

显然球衣服务器1.13罐子是asm3.1兼容和GAE 1.7.1需要ASM 4. 使用jar分装工具jarjar您可以部署ASM 3.1罐子,将与ASM发挥4.

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

+0

谢谢。你为我节省了很多时间 – Allwyn

+0

这对我也有效。谢天谢地!!! –

35

此异常是由asm-4.0.jar和asm-3.1.jar之间的兼容性问题引起的。使用新版本的AppEngine,使用了asm-4.0.jar,它与依赖于asm-3.1.jar的Jersey不兼容。为了让泽西仍然在GAE 1上工作。7,你必须去除对asm-4.0.jar的依赖。

看到这个职位:http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

IT方面测试和验证,这样的:

  1. 附加ASM-3.3.1.jar到您的受战争>的lib
  2. 将它添加到您重新构建路径
  3. 物理上删除ASM-4.0.jar
  4. 项目 - >属性 - >谷歌 - > AppEngine上:切换到Datanuclueus V1

这就是它!

+0

谢谢,这确实节省了我的时间。 – eskalera

+0

谢谢你2,nobrainer 4我:) – jaanus

+0

+1。简单而高效的 – Cassio

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> 
4

新泽西版本1.18.1不依赖于Asm 3,所以它与GAE兼容!

+0

,经过半天的浏览后,终于解决了它。 Thnx – Pega88

+0

球衣1.19也不错。 –

0

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

相关问题