Подтвердить что ты не робот

Java.lang.IncompatibleClassChangeError: реализация развертывания класса в приложении

Я написал пару сервисов REST, используя Джерси 1.13 на JRE 1.6. Все работает нормально локально, но после развертывания в 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)****

Любая помощь будет оценена.

4b9b3361

Ответ 1

Это исключение вызвано проблемами совместимости между asm-4.0.jar и asm-3.1.jar. С новой версией AppEngine используется asm-4.0.jar, и он несовместим с Джерси, который опирается на asm-3.1.jar. Чтобы заставить Джерси по-прежнему работать на GAE 1.7, вам нужно удалить зависимость от asm-4.0.jar.

Смотрите это сообщение: http://cloudvane.com/2012/09/23/problem-with-google-appengine-and-jersey-with-java/

Он проверен и проверен, например:

  • добавить asm-3.3.1.jar в вашу war- > lib
  • добавьте его в путь re build
  • физически удалить asm-4.0.jar
  • Проект → Свойства → Google → AppEngine: переключение Datanuclueus на v1

Вот так!

Ответ 2

Инструкции этот пост позаботились о моей проблеме.

Очевидно, что jersey-server 1.13 jar совместим с asm3.1, а для GAE 1.7.1 требуется ASM 4. Используя инструмент jarjar для переупаковки Jar, вы можете развернуть банку asm 3.1, которая будет играть с asm 4.

Возможно, вам понадобится использовать JarJar версии 1.3, если 1.4 дает сообщение об ошибке.

Ответ 3

Новая версия Джерси 1.18.1 не зависит от Asm 3, поэтому она совместима с GAE!

Ответ 4

Возможно, это поможет: java.lang.IncompatibleClassChangeError: Реализация класса Mongo

Это не совсем тот же класс, но проблема возникает, когда у вас есть библиотека с 2 различными версиями банок. Убедитесь, что вы не добавили никаких дополнительных библиотек или (я объясню, что со мной произошло):

У вас есть A-1.0.jar и A-1.0.jar внутри другой банки, скажем B-1.0.jar, но вы включили отдельно B-2.0.jar, и таким образом две разные версии B-банки являются проблемой.

Убедитесь, что вы этого не сделали.

Ответ 5

Такая же проблема здесь, но я считаю, что исправил ее!

Трюк запускал чистую внутреннюю часть затмения, которая уведомила меня о следующей ошибке:

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: у вас, похоже, есть ASM v3 в CLASSPATH, и вам нужен ASM v4

По-видимому, GAE не любит загружать две версии ASM. По прихоти я вошел в свойства проекта eclipse и изменил версию datanucleus с v2 на v1. Я перераспределен, и теперь мое приложение работает. Так много для того, чтобы поймать эти проблемы в локальной среде.,

Думаю, я потратил больше времени на настройку GAE для работы с трикотажем, чем на самом деле писал приложение. Это может быть мое первое и последнее размещенное на GAE приложение.

Ответ 6

Обновлен ли SDK вашего приложения? (В последнее время SDK для приложений обновлен с 1.7.0 до 1.7.1.)

Попробуйте вернуть SDK вашего приложения на 1.7.0. Я пробовал множество решений, которые я нашел в Интернете, ни одна из них не работала для меня, но эта работа работала.

Я понятия не имею, как я могу безопасно изменить версию sdk для проекта движка приложения на данный момент. Если кто-то знает, как изменить версию приложения SDK, сообщите мне.

Ответ 7

Я получил эту ошибку, работая над проектом maven, используя Jersey-1.11 для разработки службы REST: cglib-3.0 зависит от asm-4.0, поэтому я исключил его, оставив asm-3.0 стоять. Это потому, что версия Джерси, которую я использую, использует 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>

Ответ 8

Я изменил Persistence с JAP2 на JPA1, и это сработало для меня.