2012-10-08 23 views
5

Cuando compilo y ejecuto mi proyecto en Eclipse con JDK7 o JDK6 todo está bien. Sin embargo, después construyo utilizando ANT y luego trató de ejecutarlo utilizando el sistema JDK7, me sale el error:Java 7 - Marcos de mapa de pila inconsistentes - Necesito ayuda para entender por qué la solución funciona

marcos inconsistentes stackmap en objeto de bifurcación 25 en myClass.myMethod método() [[Ljava/lang/Object; en el offset 14

He buscado por todas partes y se encontró un par de buenas preguntas aquí en StackOverflow:

Tanto básicamente sugieren añadir -XX:-UseSplitVerifier como Opción JVM que solucionó el problema. Todavía no entiendo completamente por qué, pero al parecer this bug report se supone que debe ayudar. Desafortunadamente todavía no lo entiendo ...

Me di cuenta en una de las preguntas que alguien estaba usando la programación orientada a Aspect, que me hizo pensar que estoy usando Guice (marco DI de Google) que podría causar el problema pero no puedo ver cómo. Se supone que es compatible con JDK7.

También estoy usando Proguard pero también se supone que debe funcionar con JDK7.

De todas formas, en este momento no tengo idea de por qué funciona esta solución aparte de básicamente retroceder a la versión anterior de JDK (en este caso, JDK6) cuando alguna parte del código intenta jugar con el código de bytes (que es por eso que creo que está relacionado con el código DI). Pero todavía no soy capaz de establecer el enlace adecuado. ¡Y también podría estar muy lejos!

Si alguien pudiera explicarme lo que sucede o por qué sucede esto, le agradecería enormemente. También realmente odio tener que usar una solución ya que esto no es lo que considero una solución a largo plazo.

+0

* "Se supone que es compatible con JDK7." * - tal vez su soporte tenga errores. ¿Ha buscado en el rastreador/grupos/listas de Guice? –

+0

No he podido encontrar nada en términos de errores en su rastreador de problemas –

+0

Supongo que en java7 agregaron un código de bytes más agresivo verificando cheques y lo que sea que guice esté haciendo con el código de bytes para hacer su inyección de dependencia no no trabaje con esos controles –

Respuesta

3

A partir de Java 7, el bytecode compilado debe contener atributos adicionales de StackMapTable. Esto ayuda al verificador dentro de la JVM a verificar que las clases estén bien construidas, en el tiempo de carga de la clase. Las versiones anteriores de Java son más indulgentes, recurriendo a la verificación más lenta sin atributos.

Las herramientas que modifican el bytecode compilado original (ProGuard justo después de la compilación, los marcos AOP justo antes de la ejecución, ...) necesitan actualizar los atributos de forma coherente con el código modificado. Si no lo hacen, obtendrás el mensaje de error "Marcos de mapa de pila inconsistentes".

ProGuard debe realizar esta preverificación bien; No estoy al tanto de ningún problema con eso. Si aún ve el error sin aplicar ProGuard, el problema debe estar en DI o AOP.

Cuestiones relacionadas