La compréhension de la façon de résoudre “Incompatible stackmap images” exception
J'obtiens une exception au démarrage de l'application web que guice est d'essayer de construire la classe.
java.lang.VerifyError: Inconsistent stackmap frames at branch target 2770 in method com.aptusi.apps.magazine.api.servlet.internal.EditorServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Lcom/aptusi/persistence/runtime/framework/DboSession;)V at offset 200
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)
at java.lang.Class.getDeclaredConstructors(Class.java:1891)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:146)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:66)
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:103)
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:102)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)`
Je sais à propos de la -XX:-UseSplitVerifier et -noverify options jvm, mais je ne veux pas l'utiliser comme je veux m'assurer que tout le code de ce projet est d'au moins la version java 7.
Pour ce faire, Il serait utile de comprendre d'où vient exactement ce qui se passe dans mon code, il n'est pas clair pour moi ce que le décalage de 200 mentionné est mais peut-il être lié à un numéro de ligne?
Aussi personne ne sait d'une manière que je peux trouver les versions de java de toutes les classes sur mon chemin de classe, je suis en utilisant maven donc il y a beaucoup de dépendances, donc je suis à la recherche d'un moyen automatisé de constatation des classes sur le chemin de la classe qui ont été compilées dans une moindre java la version 1.7?
OriginalL'auteur PiersyP | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
De trouver la version de classfile, il suffit de regarder les 8 octets de la classfile. Il sera de 51 pour Java 7 classes. Un cadre comme l'ASM va le faire pour vous.
Aussi loin que l'erreur disparaît, cela signifie que votre classfile est mal formé. Comment avez-vous créé ces classes? Avez-vous de manipulation de bytecode? Si donc, vous avez probablement un bug dans votre code.
Il suffit d'écrire un script Python (en supposant que vous savez où les pots sont situés).
Il semble que la seule façon de vérifier cela, même si je suis surpris qu'il n'y est pas pour cela l'outil déjà.
Savez-vous comment la compensation porte sur le numéro de ligne dans le fichier de classe?
c'est toujours la même méthode statique qui échoue. Mais il ne parvient pas au hasard. Parfois je me reconstruire une dépendance et il s'en va, parfois ça ne marche pas sur le serveur de développement, et sur la fga du serveur de production. Je ne comprends pas ce que la GAE sdk au moment de l'exécution, il pourrait faire un bytecode modification. J'ai trouvé un rapport de bug à partir de 2012 qui a montré que l'erreur qui se passe avec le compilateur Eclipse, donc je ne sais pas. Un peu bizarre interaction
OriginalL'auteur Antimony