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をGAE1.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 を別々に含めているため、このように 2 つの異なるバージョン 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 は 2 つのバージョンの ASM をロードすることを好まないようです。気まぐれで、Eclipse プロジェクトのプロパティに入り、datanucleus のバージョンを v2 から v1 に変更しました。再デプロイしたところ、アプリが機能するようになりました。ローカル開発環境でこの種の問題をキャッチするのはこれで終わりです。. .

実際にアプリを作成するよりも、GAE を jersey で実行するように構成するのに多くの時間を費やしたと思います。これは、私の最初で最後の GAE ホスト型アプリかもしれません。

于 2012-08-29T15:08:42.040 に答える
0

App Engine の SDK を更新しましたか? (最近、App Engine SDK が 1.7.0 から 1.7.1 に更新されました。)

アプリ エンジンの SDK を 1.7.0 に戻してみてください。インターネットで見つけた多くの解決策を試しましたが、どれもうまくいきませんでしたが、これはうまくいきました。

今のところ、アプリ エンジン プロジェクトの SDK バージョンを安全に変更する方法がわかりません。アプリのSDKのバージョンを変更する方法をご存知の方がいらっしゃいましたら教えてください。

于 2012-08-29T12:25:10.433 に答える