Ich untersuche Folgendes java.lang.VerifyError
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
Es tritt auf, wenn der jboss-Server gestartet wird, auf dem das Servlet bereitgestellt wird. Es wurde mit jdk-1.5.0_11 kompiliert und ich habe versucht, es mit jdk-1.5.0_15 ohne Erfolg neu zu kompilieren. Das heißt, die Kompilierung läuft einwandfrei, aber bei der Bereitstellung tritt der java.lang.VerifyError auf.
Als ich den Methodennamen änderte und den folgenden Fehler bekam:
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
Sie können sehen, dass mehr von der Methodensignatur angezeigt wird.
Die tatsächliche Methodensignatur lautet
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
Ich habe bereits versucht, es mit zu betrachten, javap
und das gibt die Methodensignatur so, wie sie sein sollte.
Wenn meine anderen Kollegen den Code auschecken, kompilieren und bereitstellen, haben sie das gleiche Problem. Wenn der Build-Server den Code aufnimmt und in Entwicklungs- oder Testumgebungen (HPUX) bereitstellt, tritt der gleiche Fehler auf. Auch eine automatisierte Testmaschine, auf der Ubuntu ausgeführt wird, zeigt denselben Fehler beim Serverstart an.
Der Rest der Anwendung läuft in Ordnung, nur das eine Servlet ist außer Betrieb. Irgendwelche Ideen, wo man suchen sollte, wären hilfreich.
quelle
Antworten:
java.lang.VerifyError
kann das Ergebnis sein, wenn Sie für eine andere Bibliothek kompiliert haben, als Sie zur Laufzeit verwenden.Dies ist mir beispielsweise passiert, als ich versucht habe, ein Programm auszuführen, das für Xerces 1 kompiliert wurde, aber Xerces 2 im Klassenpfad gefunden wurde. Die erforderlichen Klassen (in
org.apache.*
Namensraum) wurden zur Laufzeit gefunden, soClassNotFoundException
war nicht das Ergebnis. Die Klassen und Methoden wurden geändert, sodass die zur Laufzeit gefundenen Methodensignaturen nicht mit denen zur Kompilierungszeit übereinstimmten.Normalerweise kennzeichnet der Compiler Probleme, bei denen Methodensignaturen nicht übereinstimmen. Die JVM überprüft den Bytecode erneut, wenn die Klasse geladen wird, und löst aus,
VerifyError
wenn der Bytecode versucht, etwas zu tun, das nicht zulässig sein sollte - z. B. das Aufrufen einer Methode, die zurückgibt,String
und das Speichern dieses Rückgabewerts in einem Feld, das a enthältList
.quelle
-verbose:class
und suchen Sie kurz vor dem Laden nach der Klassejava.lang.VerifyError
. Dies wird den Weg zum JAR haben. Verwenden Sie dasjavap
und vergleichen Sie es mit der Klasse, für die Sie kompilieren. Ich fand dies nützlich, da die im Fehler gemeldete Klasse nicht die Ursache war, sondern tatsächlich eines der Argumente war.java.lang.VerifyError
sind die schlimmsten.Sie würden diesen Fehler erhalten, wenn die Bytecode-Größe Ihrer Methode die 64-KB-Grenze überschreitet. aber das hättest du wahrscheinlich bemerkt.
Sind Sie zu 100% sicher, dass diese Klasse an keiner anderen Stelle in Ihrer Anwendung im Klassenpfad vorhanden ist, möglicherweise in einem anderen Glas?
utf-8
Ist aus Ihrem Stacktrace auch die Zeichenkodierung der Quelldatei ( ?) Ist das korrekt?quelle
Wie Kevin Panko sagte, liegt es hauptsächlich an Bibliotheksänderungen. In einigen Fällen reicht eine "Bereinigung" des Projekts (Verzeichnisses) gefolgt von einem Build aus.
quelle
Eine Sache, die Sie versuchen könnten, ist die Verwendung,
-Xverify:all
die den Bytecode beim Laden überprüft und manchmal hilfreiche Fehlermeldungen ausgibt, wenn der Bytecode ungültig ist.quelle
Ich habe diesen Fehler unter Android behoben, indem ich das Projekt erstellt habe, für das ich eine Bibliothek importiert habe, wie hier beschrieben: http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
Zuvor habe ich nur auf das Projekt verwiesen (es nicht zu einer Bibliothek gemacht) und diesen seltsamen VerifyError erhalten.
Hoffe es hilft jemandem.
quelle
VerifyError bedeutet, dass die Klassendatei Bytecode enthält, der syntaktisch korrekt ist, jedoch eine semantische Einschränkung verletzt, z. B. ein Sprungziel, das Methodengrenzen überschreitet.
Grundsätzlich kann ein VerifyError nur auftreten, wenn ein Compilerfehler vorliegt oder wenn die Klassendatei auf andere Weise beschädigt wird (z. B. durch fehlerhaften RAM oder eine fehlerhafte Festplatte).
Versuchen Sie, mit einer anderen JDK-Version und auf einem anderen Computer zu kompilieren.
quelle
In meinem Fall hängt mein Android-Projekt von einem anderen Java-Projekt ab, das für Java 7 kompiliert wurde. Es ist
java.lang.VerifyError
verschwunden, nachdem ich die Compiler-Konformitätsstufe dieses Java-Projekts auf 6.0 geändert habeSpäter fand ich heraus, dass dies ein Dalvik-Problem ist: https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE
quelle
Ich habe dieses Problem bekommen, weil pack200 eine Klassendatei entstellt hat. Ein bisschen Suchen hat diesen Java-Fehler aufgedeckt . Grundsätzlich hat die Einstellung dazu geführt,
--effort=4
dass das Problem behoben wurde.Verwenden von Java 1.5.0_17 (obwohl es in jeder einzelnen Variante von Java 1.5 aufgetaucht ist, in der ich es ausprobiert habe).
quelle
Ich habe ein ähnliches Problem mit java.lang.VerifyError durch Ersetzen behoben
mit
wo
MagickException
wurde in einem Bibliotheksprojekt definiert (von dem mein Projekt abhängig ist).Danach habe ich
java.lang.NoClassDefFoundError
ungefähr eine Klasse aus derselben Bibliothek (behoben gemäß https://stackoverflow.com/a/9898820/755804 ).quelle
Dies kann unter Android passieren, wenn Sie versuchen, eine Bibliothek zu laden, die mit dem JDK von Oracle kompiliert wurde.
Hier ist das Problem für den Ning Async HTTP-Client.
quelle
In meinem Fall musste ich diesen Block entfernen:
Es wurde ein Fehler in der Nähe des
Fragment.showDialog()
Methodenaufrufs angezeigt.quelle
Minimales Beispiel, das den Fehler generiert
Eine einfache Möglichkeit besteht darin, Jasmin zu verwenden oder den Bytecode manuell mit einem Binärdatei-Editor zu bearbeiten.
Erstellen wir eine
void
Methode ohnereturn
Anweisung (generiert durch diereturn;
Anweisung in Java), die laut JVMS illegal ist.In Jasmin konnten wir schreiben:
Wir tun dann
javac Main.j
undjavap -v Main
sagen, dass wir zusammengestellt haben:Es gibt also wirklich keine Rückgabeanweisung.
Wenn wir jetzt versuchen zu rennen
java Main
, bekommen wir:Dieser Fehler kann normalerweise nie in Java passieren, da die Java - Compiler ein implizites fügen
return
anvoid
Methoden für uns. Aus diesem Grund müssen wirreturn
unserenmain
Methoden kein a hinzufügen . Sie können dies mit überprüfenjavap
.JVMS
VerifyError tritt auf, wenn Sie versuchen, bestimmte Arten von unzulässigen Klassendateien auszuführen, wie in JVMS 7, Kapitel 4.5 angegeben
Das JVMS gibt an, dass Java beim Laden einer Datei eine Reihe von Überprüfungen ausführen muss, um festzustellen, ob die Klassendatei in Ordnung ist, bevor sie ausgeführt wird.
Solche Fehler können nicht in einem einzigen Kompilierungs- und Ausführungszyklus von Java-Code generiert werden, da in JVMS 7 4.10 Folgendes angegeben ist :
Um ein Beispiel für einen minimalen Fehler zu sehen, müssen wir den Quellcode ohne generieren
javac
.quelle
Diese Seite kann Ihnen einige Hinweise geben - http://www.zanthan.com/itymbi/archives/000337.html
Es kann einen subtilen Fehler im Körper dieser Methode geben, den Javac nicht erkennt. Schwer zu diagnostizieren, wenn Sie nicht die gesamte Methode hier veröffentlichen.
Sie könnten damit beginnen, so viele Variablen wie möglich als endgültig zu deklarieren ... das hätte den auf der Zanthan-Site erwähnten Fehler behoben und ist sowieso oft eine gute Praxis.
quelle
Nun, in meinem Fall hatte mein Projekt A eine Abhängigkeit von einem anderen, sagen wir X (A verwendete einige der in X definierten Klassen). Als ich X als Referenzprojekt in den Erstellungspfad von A einfügte, wurde dieser Fehler angezeigt. Als ich jedoch X als das referenzierte Projekt entfernte und X's jar als eine der Bibliotheken einbezog, war das Problem gelöst.
quelle
Suchen Sie in Ihrem Klassenpfad nach mehreren Versionen derselben JAR-Datei.
Zum Beispiel hatte ich opennlp-tools-1.3.0.jar und opennlp-tools-1.5.3.jar in meinem Klassenpfad und bekam diesen Fehler. Die Lösung bestand darin, opennlp-tools-1.3.0.jar zu löschen.
quelle
CGLIB <2.2 mit JRE> 6 kann ähnliche Fehler auslösen, siehe "Soll ich auf CGLIB 3.0 aktualisieren?" und einige Kommentare bei Spring SPR-9669 .
Dies gilt insbesondere dann, wenn bei JRE 6 alles einwandfrei funktioniert und ein einfacher Wechsel zu JRE7 zu Problemen führt.
quelle
Ein weiterer Grund für diesen Fehler kann die Kombination von AspectJ <= 1.6.11 mit JRE> 6 sein.
Siehe Eclipse Bug 353467 und Kieker Ticket 307 für Details.
Dies gilt insbesondere dann, wenn bei JRE 6 alles einwandfrei funktioniert und die Umstellung auf JRE7 Probleme verursacht.
quelle
Dies kann auch passieren, wenn Sie viele Modulimporte mit maven haben. Es gibt zwei oder mehr Klassen mit genau demselben Namen (gleicher qualifizierter Name). Dieser Fehler resultiert aus unterschiedlichen Interpretationen zwischen Kompilierungszeit und Laufzeit.
quelle
Wenn Sie auf Java7 migrieren oder Java7 verwenden, wird dieser Fehler im Allgemeinen angezeigt. Ich hatte die oben genannten Fehler und hatte große Probleme , die Hauptursache herauszufinden. Ich würde vorschlagen, das JVM-Argument "-XX: -UseSplitVerifier" hinzuzufügen, während Sie Ihre Anwendung ausführen .
quelle
Nach dem Update
Gradle
in Android Studio 3.6.1 kam es in Release 19 zu Abstürzen auf API 19.Es ist ein
Glide
Bibliotheksfehler aufgetreten . Die Lösung besteht darin, proguard-rules.txt neu zu schreiben .Auch ein Downgrade
Gradle
funktioniert (classpath 'com.android.tools.build:gradle:3.5.3'
), aber es ist eine veraltete Lösung, verwenden Sie es nicht.quelle
Der von Kevin erwähnte Grund ist zwar richtig, aber ich würde es auf jeden Fall weiter unten überprüfen, bevor ich zu etwas anderem übergehe:
cglibs
in meinem Klassenpfad.hibernate
Versionen in meinem Klassenpfad.Die Chancen stehen gut, dass mehrere oder widersprüchliche Versionen der oben genannten Probleme zu unerwarteten Problemen wie dem fraglichen führen können.
quelle
java.lang.VerifyError bedeutet, dass Ihr kompilierter Bytecode auf etwas verweist, das Android nicht finden kann. Dieser verifyError gibt mir nur Probleme mit kitkat4.4 und einer kleineren Version, die nicht in der obigen Version enthalten ist , selbst wenn ich auf beiden Geräten denselben Build ausgeführt habe. Wenn ich den Jackson Json Parser einer älteren Version verwendet habe, wird java.lang.verifyerror angezeigt
Dann habe ich die Dependancy der geänderten neueste Version 2,2 bis 2,7 ohne die Kernbibliothek , dann funktioniert es. Dies bedeutet, dass die Methoden und andere Inhalte des Kerns auf die neueste Version von Databind2.7 migriert werden . Dies behebt meine Probleme.
quelle
Bitte entfernen Sie alle unbrauchbaren JAR-Dateien und versuchen Sie sie auszuführen. und seine Arbeit für mich Ich fügte eine Jcommons JAR-Datei und auch eine andere Jcommons.1.0.14 JAR-Datei hinzu, also entferne Jcommons und es funktioniert für mich
quelle
in Datei schreiben:
in Abhängigkeiten weiter:
<module name="sun.jdk"/>
quelle
In meinem Fall wurde ein Überprüfungsfehler mit der folgenden Stapelverfolgung angezeigt
Ich habe es behoben, indem ich den Klassenpfadeintrag für commons-codec-1.3.jar entfernt habe. Die Version dieses JARs stimmte nicht mit der Version überein, die mit Jasper geliefert wurde.
quelle