2012-08-28 32 views
17

Tôi đã viết một vài dịch vụ REST bằng Jersey 1.13 trên JRE 1.6. Mọi thứ đều chạy tốt tại địa phương, nhưng sau khi tôi triển khai GAE tôi nhận được lỗi này:java.lang.IncompatibleClassChangeError: Triển khai lớp triển khai cho công cụ ứng dụng

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

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

0

Bạn đã cập nhật SDK của công cụ ứng dụng chưa? (Gần đây, SDK công cụ ứng dụng đã được cập nhật từ 1.7.0 lên 1.7.1.)

Hãy thử hoàn nguyên SDK của công cụ ứng dụng của bạn thành 1.7.0. Tôi đã thử nhiều giải pháp mà tôi tìm thấy trên Internet, không ai trong số họ làm việc cho tôi, nhưng điều này đã làm việc.

Tôi không biết làm cách nào để thay đổi phiên bản sdk của công cụ ứng dụng của mình một cách an toàn ngay bây giờ. Nếu có ai biết cách thay đổi phiên bản SDK của ứng dụng, vui lòng cho tôi biết.

3

Có lẽ điều này sẽ giúp: java.lang.IncompatibleClassChangeError: Implementing class Mongo

Nó không phải chính xác cùng lớp, nhưng vấn đề xảy ra khi bạn có một thư viện với 2 lọ phiên bản khác nhau. Đảm bảo bạn không bao gồm bất kỳ thư viện bổ sung nào hoặc (Tôi sẽ giải thích những gì đã xảy ra với tôi):

Bạn có A-1.0.jar và A-1.0.jar có bên trong một bình khác, giả sử B-1.0.jar , nhưng bạn đã bao gồm riêng một B-2.0.jar và theo cách này, hai lọ B phiên bản khác nhau là vấn đề.

Đảm bảo bạn không thực hiện việc này.

1

Cùng một vấn đề ở đây, nhưng tôi tin rằng tôi đã sửa nó!

Bí quyết được chạy bên trong sạch của nhật thực toàn phần, trong đó thông báo cho tôi về các lỗi sau:

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 

Các bit quan trọng. . .

Nguyên nhân: org.datanucleus.exceptions.NucleusUserException: Bạn dường như có v3 ASM trong CLASSPATH và bạn cần ASM v4

Rõ ràng, GAE không thích có hai phiên bản của ASM nạp. Trên một ý thích, tôi đã đi vào các thuộc tính dự án eclipse và thay đổi phiên bản datanucleus từ v2 thành v1. Tôi đã triển khai lại và bây giờ ứng dụng của tôi hoạt động. Vì vậy, nhiều để bắt các loại vấn đề trong môi trường dev địa phương. . .

Tôi nghĩ rằng tôi đã dành nhiều thời gian hơn để định cấu hình GAE để chạy bằng jersey hơn là tôi đã thực sự viết ứng dụng. Đây có thể là ứng dụng được lưu trữ GAE đầu tiên và cuối cùng của tôi.

9

Hướng dẫn trên this post giải quyết vấn đề của tôi.

Rõ ràng jersey-server 1,13 jar tương thích với asm3.1 và GAE 1.7.1 cần ASM 4. Sử dụng công cụ đóng gói lại Jar Jarjar bạn có thể triển khai một asm 3.1 jar mà sẽ chơi với asm 4.

Bạn có thể cần sử dụng JarJar phiên bản 1.3 nếu 1.4 đưa ra thông báo lỗi.

+0

Cảm ơn bạn. Bạn đã tiết kiệm cho tôi rất nhiều thời gian – Allwyn

+0

Điều đó cũng hiệu quả với tôi. Ơn Chúa!!! –

35

Ngoại lệ này do sự cố tương thích giữa asm-4.0.jar và asm-3.1.jar. Với phiên bản mới của AppEngine, asm-4.0.jar được sử dụng và nó không tương thích với Jersey, dựa trên asm-3.1.jar. Để làm cho Jersey vẫn hoạt động trên GAE 1.7, bạn phải loại bỏ sự phụ thuộc vào asm-4.0.jar.

Xem bài đăng này: http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

Nó s kiểm tra và xác minh, như thế:

  1. add asm-3.3.1.jar để bạn war-> lib
  2. thêm nó vào bạn lại xây dựng con đường
  3. loại bỏ chất asm-4.0.jar Dự án
  4. -> Properties -> Google -> AppEngine: chuyển Datanuclueus để V1

Đó là nó!

+0

Cảm ơn, điều đó thực sự đã giúp tôi tiết kiệm thời gian. – eskalera

+0

Cảm ơn 2 bạn, nobrainer 4 me :) – jaanus

+0

+1. Đơn giản và hiệu quả – Cassio

0

Tôi gặp lỗi này khi làm việc trên dự án maven sử dụng Jersey-1.11 để phát triển dịch vụ REST: cglib-3.0 phụ thuộc vào asm-4.0 và vì vậy tôi loại trừ nó, để asm-3.0 đứng. Điều này là do phiên bản Jersey tôi đang sử dụng sử dụng 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

Phiên bản Jersey mới 1.18.1 không phụ thuộc vào Asm 3, vì vậy nó tương thích với GAE!

+0

sau nửa ngày duyệt SO, điều này cuối cùng đã giải quyết được. Thnx – Pega88

+0

jersey 1.19 cũng tốt. –

0

Tôi đã thay đổi Persistence từ JAP2 thành JPA1 và nó đã làm việc cho tôi.

Các vấn đề liên quan