2012-10-08 9 views
5

Wenn ich mein Projekt in Eclipse mit JDK7 oder JDK6 kompilieren und ausführen, ist alles in Ordnung. Aber nachdem ich es mit ANT gebaut habe und dann versucht habe, es mit dem System JDK7 zu starten, erhalte ich den Fehler:Java 7 - Inkonsistente Stackmap-Frames - Brauchen Sie Hilfe zu verstehen, warum Lösung funktioniert

Inkonsistente Stapelmapframes bei Zweigziel 25 in Methode myClass.myMethod() [[Ljava/lang/Object; bei Offset 14

Ich habe überall gesucht und ein paar gute Fragen hier auf Stackoverflow gefunden:

Sowohl im Grunde legen nahe -XX:-UseSplitVerifier als hinzufügen JVM-Option, die das Problem gelöst hat. Ich verstehe immer noch nicht ganz, warum, aber anscheinend this bug report soll helfen. Leider bekomme ich es immer noch nicht ...

Ich habe auf einer der Fragen bemerkt, dass jemand Aspect-orientierte Programmierung verwendet, die mich denken ließ, dass ich Guice (Googles DI-Framework) verwende, das das Problem verursachen könnte aber ich kann nicht sehen wie. Es soll JDK7 unterstützen.

Ich benutze auch Proguard, aber das soll auch mit JDK7 arbeiten.

An dieser Stelle habe ich keine Ahnung, warum diese Problemumgehung funktioniert anders als es im Grunde auf die vorherige JDK (in diesem Fall JDK6) Version zurückfällt, wenn ein Teil des Codes versucht, mit dem Byte-Code zu spielen Deshalb denke ich, dass es mit dem DI-Code zusammenhängt. Aber ich bin immer noch nicht in der Lage, die richtige Verbindung herzustellen. Und ich könnte auch weit weg sein !!

Wenn jemand erklären könnte, was los ist oder warum das passiert, wäre ich sehr dankbar. Außerdem hasse ich es wirklich, einen Workaround zu verwenden, da dies nicht eine langfristige Lösung ist.

+0

* "Es wird angenommen, JDK7 zu unterstützen." * - vielleicht ist seine Unterstützung fehlerhaft. Haben Sie den Guice Issue Tracker/Gruppen/Listen durchsucht? –

+0

Ich war nicht in der Lage, etwas in Bezug auf Bugs in ihrem Issue Tracker zu finden –

+0

Meine Vermutung wäre, dass sie in Java7 mehr aggressive Byte-Code Überprüfung Checks und was auch immer macht guice macht mit dem Byte-Code, um seine Abhängigkeits-Injektion zu tun tut arbeite nicht mit diesen checks –

Antwort

3

Ab Java 7 muss kompilierter Bytecode zusätzliche StackMapTable-Attribute enthalten. Diese helfen dem Verifizierer in der JVM, um zu überprüfen, ob die Klassen zum Zeitpunkt des Ladens der Klasse ordnungsgemäß aufgebaut sind. Frühere Java-Versionen sind milder und greifen auf die langsamere Verifizierung ohne Attribute zurück.

Werkzeuge, die den ursprünglichen kompilierten Bytecode modifizieren (ProGuard direkt nach der Kompilierung, AOP Frameworks kurz vor der Ausführung, ...) müssen die Attribute konsistent mit dem modifizierten Code aktualisieren. Wenn dies nicht der Fall ist, erhalten Sie die Fehlermeldung "Inkonsistente Stapelrahmen".

ProGuard sollte diese Vorprüfung durchführen; Mir sind keine Probleme bekannt. Wenn Sie den Fehler immer noch sehen, ohne ProGuard zu verwenden, muss das Problem beim DI oder AOP liegen.

Verwandte Themen