Java.lang.VerifyError almanın nedenleri


191

Aşağıdakileri araştırıyorum 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)

Sunucu uygulamasının konuşlandırıldığı jboss sunucusu başlatıldığında oluşur. Bu jdk-1.5.0_11 ile derlenmiş ve başarıyla jdk-1.5.0_15 ile derlemeye çalıştım. Bu derleme iyi çalışır ama konuşlandırıldığında java.lang.VerifyError oluşur.

Yöntem adını değiştirip aşağıdaki hatayı aldığımda:

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)

Yöntem imzasının daha fazlasının görüntülendiğini görebilirsiniz.

Gerçek yöntem imzası

  private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
                          Collection calendarDays,
                          HashMap bcSpecialDays,
                          Collection activityPeriods,
                          Locale locale, MessageResources resources) throws   Exception {

Zaten ona bakmayı denedim javapve olması gerektiği gibi yöntemin imzasını veriyor.

Diğer meslektaşlarım kodu kontrol ettiklerinde, derlediklerinde ve konuşlandırdıklarında, aynı sorunla karşılaşırlar. Yapı sunucusu kodu aldığında ve geliştirme veya test ortamlarında (HPUX) dağıtırsa, aynı hata oluşur. Ayrıca Ubuntu çalıştıran otomatik bir test makinesi de sunucu başlatılırken aynı hatayı gösterir.

Uygulamanın geri kalanı iyi çalışır, sadece bir sunucu uygulaması bozuk. Nereye bakılacağına dair herhangi bir fikir yardımcı olacaktır.


1
KarşılaştırmaFailure yanlış sürümünü kullanarak aldım. Bu acı vericiyi bulmak için sonsuza dek sürdü
Tim Boland

1
Android stüdyosunda anında çalıştırma kullanırken (derlemede hotswapping) anladım. Kapatmak işi yaptı.
Serge

Yanıtlar:


188

java.lang.VerifyError çalışma zamanında kullandığınızdan farklı bir kitaplığa karşı derlediğinizde sonuç olabilir.

Örneğin, bu Xerces 1'e karşı derlenmiş bir programı çalıştırmaya çalışırken başıma geldi, ancak Xerces 2 sınıf yolunda bulundu. (Gerekli sınıfları org.apache.*ad) bu yüzden, çalışma zamanında bulundu ClassNotFoundExceptionoldu değil sonucu. Sınıflarda ve yöntemlerde değişiklikler yapıldı, böylece çalışma zamanında bulunan yöntem imzaları derleme zamanında olanlarla eşleşmedi.

Normal olarak, derleyici yöntem imzalarının eşleşmediği sorunları işaretler. JVM, sınıf yüklendiğinde bayt kodunu tekrar doğrular ve bayt VerifyErrorkodu, izin verilmemesi gereken bir şey yapmaya çalıştığında atar - örneğin, döndüren Stringve sonra bu değeri döndüren bir alana depolayan bir yöntemi çağırmak List.


3
Eklenecek bir şey var, bazen IDE'nin hatası veya bayt kodunun doğru olmadığı cihaz. Senkronizasyon sorununu tanıması için IDE'yi yeniden başlatmayı deneyin. Uygulama silinip yeniden yüklenemedi. Cihazı yeniden başlatmak da yardımcı olabilir.
ima747

2
Hangi sınıfın suçlu olduğunu bulmak için VM argümanını ekleyin -verbose:classve yüklemeden hemen önce sınıfı arayın java.lang.VerifyError. Bunun JAR yolu vardır. Kullanın javapve derlediğiniz sınıfla karşılaştırın. Ben hata bildirilen sınıf aslında argümanlardan biri olduğu neden olarak bu yararlı buldum.
steinybot

21

java.lang.VerifyError en kötüsü.

Yönteminizin bayt kodu boyutu 64kb sınırını aşarsa bu hatayı alırsınız; ama muhtemelen bunu fark ederdiniz.

Bu sınıfın uygulamanızın başka bir yerinde, belki başka bir kavanozda sınıf yolunda bulunmadığından% 100 emin misiniz?

Ayrıca, yığın izlemenizden, kaynak dosyanın ( utf-8?) Karakter kodlaması doğru mu?


Eminim başka bir yerde yok. 43Kb, bu hala büyük bir sınıf.
Jeroen Wyseur

Bu yazı için teşekkürler, benim durumumda, farklı bir kodlama oldu: JasperReports XMl dosyaları bir kodlama ve bir java sürümü kaydedin, bunu proje ayarlarınıza göre ayarlamanız gerekir (iReport aracılığıyla). Buradaki problem buydu, kodlama ile ilgili fikriniz için teşekkürler! :)
Tobias

Bu, android testleri için benim sorunumdu, multidexing bunu düzeltti.
Prakash Nadar

10

Kevin Panko'nun dediği gibi, çoğunlukla kütüphane değişikliği yüzünden. Yani bazı durumlarda bir "temiz" projenin (dizin) ardından bir yapı hile yapar.


9

Denemeye çalışabileceğiniz bir şey -Xverify:all, yükte bayt kodunu doğrulayacak ve bayt kodu geçersizse bazen yardımcı hata mesajları verecektir.



8

VerifyError, sınıf dosyasının sözdizimsel olarak doğru olan, ancak yöntem sınırlarını aşan bir atlama hedefi gibi bazı anlamsal kısıtlamaları ihlal eden bayt kodu içerdiği anlamına gelir.

Temel olarak, VerifyError yalnızca bir derleyici hatası olduğunda veya sınıf dosyası başka bir şekilde bozulduğunda (örn. Hatalı RAM veya başarısız bir HD yoluyla) oluşabilir.

Farklı bir JDK sürümüyle ve farklı bir makinede derlemeyi deneyin.



4

Bu sorunu bir sınıf dosyasını yöneten pack200 nedeniyle alıyordum. Biraz arama bu java hatasını ortaya çıkardı. Temel olarak,--effort=4 problemin ortadan neden oldu.

Java 1.5.0_17 kullanarak (her bir java 1.5 varyantında kırpılmış olsa da denedim).


3

Değiştirerek benzer bir java.lang.VerifyError sorunu düzeltti

        catch (MagickException e)

ile

        catch (Exception e)

nerede MagickException bir kütüphane projesinde tanımlandı (ki benim proje bağımlılığı vardır).

Bundan sonra java.lang.NoClassDefFoundErroraynı kütüphaneden bir dersim var ( https://stackoverflow.com/a/9898820/755804'e göre düzeltildi ).


1
Bu benim için çalıştı ... Gerçi "beni bir battaniye istisnası ile değiştirin ve çalışacağım" yanı sıra hatanın ne olduğunu anlamak istiyorum.
Alex Hart

@AlexHart Android için, ancak büyük olasılıkla aynı mantık kurumsal Java için geçerli olacaktır: stackoverflow.com/a/36814155/253468
TWiStErRob


2

Benim durumumda bu bloğu kaldırmak zorunda kaldım:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Fragment.showDialog()Yöntem çağrısının yanında hata gösteriyordu .


2

Hatayı oluşturan en az örnek

Basit bir olasılık Jasmin kullanmaktır veya bayt kodunu ikili bir dosya düzenleyicisiyle elle düzenlemek.

Talimat voidolmadan yöntem oluşturmayı sağlar return(return;JVMS'nin yasa dışı olduğunu söylediği Java deyimi .

Jasmin'te şunları yazabiliriz:

.class public Main
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
   aload_0 ; Just so that we won't get another verify error for empty code.
.end method

Sonra yaparız javac Main.jve javap -v Mainderlediğimizi söyleriz:

public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
    stack=1, locals=1, args_size=1
       0: aload_0

yani gerçekten iade talimatı yoktur.

Şimdi koşmaya çalışırsak şunu java Mainelde ederiz:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: (class: NoReturn, method: main signature: ([Ljava/lang/String;)V) Falling off the end of the code
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

Java derleyicisi bizim returniçin voidyöntemlere örtük eklediğinden, bu hata asla Java'da normal olarak gerçekleşemez . Biz eklemek gerekmez nedeni budur returnbizim için mainyöntemlerle. Bunu ile kontrol edebilirsiniz javap.

JVM'lerle

VerifyError, JVMS 7 bölüm 4.5'te belirtildiği gibi belirli türde yasadışı sınıf dosyası çalıştırmaya çalıştığınızda gerçekleşir

JVMS, Java bir dosya yüklediğinde, sınıf dosyasının çalıştırılmadan önce TAMAM olup olmadığını görmek için bir dizi denetim yürütmesi gerektiğini söylüyor.

Bu tür hatalar, Java kodunun tek bir derleme ve çalıştırma döngüsünde oluşturulamaz, çünkü JVMS 7 4.10 şunları söylüyor :

Java programlama dili için bir derleyici sadece tüm statik ve yapısal kısıtlamaları karşılayan sınıf dosyaları üretmek zorundadır [...]

Bu nedenle minimal bir hata örneği görmek için, kaynak kodunu oluşturmamız gerekecek javac.


1

Bu sayfa size bazı ipuçları verebilir - http://www.zanthan.com/itymbi/archives/000337.html

Bu yöntemin gövdesinde, javacın tespit edemediği ince bir hata olabilir. Burada tüm yöntemi göndermediğiniz sürece teşhis etmek zor.

Zanthan sitesinde bahsedilen hatayı yakalayan ve mümkün olduğunca çok değişken belirterek işe başlayabilirsiniz ve genellikle iyi bir uygulamadır.


1
Bu adam 2002'de bir derleyici hatasını vurdu, ancak o hata o zamandan beri düzeltildi.
Kevin Panko

1

Benim durumumda, A projemin X'e (A, X'de tanımlanan sınıflardan bazılarını kullanıyordu) başka birine bağımlıydı. Bu yüzden A'nın oluşturma yoluna referans projesi olarak X'i eklediğimde bu hatayı aldım. Ancak X'i başvurulan proje olarak kaldırdığımda ve X'in kavanozunu kütüphanelerden biri olarak dahil ettiğimde sorun çözüldü.


1

Sınıf yolunuzda aynı jar dosyasının birden çok sürümünü kontrol edin.

Örneğin, sınıf yolumda opennlp-tools-1.3.0.jar ve opennlp-tools-1.5.3.jar vardı ve bu hatayı aldım. Çözüm opennlp-tools-1.3.0.jar dosyasını silmekti.




1

Ayrıca, maven ile çok sayıda modül ithalatı yaptığınızda da olabilir. Tam olarak aynı ada (aynı nitelikli ada) sahip iki veya daha fazla sınıf olacaktır. Bu hata, derleme zamanı ve çalışma zamanı arasındaki yorum farkından kaynaklanır.


1

Java7'ye geçiş yapıyorsanız veya java7 kullanıyorsanız, genellikle bu hata görülebilir. Yukarıdaki hatalarla karşılaştım ve kök nedenini bulmak için çok uğraştım , uygulamanızı çalıştırırken "-XX: -UseSplitVerifier" JVM bağımsız değişkenini eklemeyi denemenizi öneririm .


1

Güncelledikten sonra Gradleiçinde Studio 3.6.1 Android çöker yayın oluşturma API 19 oldu.

Bir Glidekitaplık hatası oluştu . Çözüm proguard-rules.txt dosyasını yeniden yazmaktır .

Ayrıca düşürme Gradleişleri ( classpath 'com.android.tools.build:gradle:3.5.3'), ancak eski bir çözümdür, kullanmayın.


0

Kevin tarafından belirtilen neden doğruysa da, kesinlikle başka bir şeye geçmeden önce aşağıdakileri kontrol ederim:

  1. cglibsSınıf yolumu kontrol et .
  2. hibernateSınıf yolumdaki sürümleri kontrol edin .

Yukarıdakilerin herhangi birinin birden fazla veya çakışan sürümüne sahip olmanın, söz konusu gibi beklenmedik sorunlara neden olabileceği şansı yüksektir.


0

java.lang.VerifyError, derlenmiş bayt kodunuzun Android'in bulamadığı bir şeye atıfta bulunduğu anlamına gelir. Bu verifyError beni sadece kitkat4.4 ve daha az sürüm ile değil, yukarıdaki sürümde değil , her iki Cihazda da aynı derleme çalıştırdı. eski sürümü jackson json ayrıştırıcı kullandığımda java.lang.verifyerror gösterir

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'

Sonra , çekirdek kütüphanesi olmadan Dependancy'yi en son sürüm 2.2'den 2.7'ye değiştirdim , o zaman işe yarıyor. bu da Çekirdek'in Yöntemleri ve diğer içeriğinin Databind2.7'nin en son sürümüne geçirildiği anlamına gelir . Bu benim Sorunlarımı düzeltmek.

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'

Hangi JAR'a bakacağınızı nereden biliyorsunuz?
Siddharth

1
jackson-core: 2.2. + artık miras oldu. bu nedenle databind: 2.7.0-rc3, ek açıklamalar: 2.7.0-rc3 veya bundan daha son sürümü kullanmamız gerekiyor. Bu 2 yeterlidir, jackson çekirdeğinden kaçının: 2.2. +. O zamana kadar bazı doğrulayıcılarım var.
2.7+

0

lütfen kullanılamaz jar dosyasını kaldırın ve çalıştırmayı deneyin. ve onun benim için bir jcommons jar dosyası ve ayrıca başka bir jcommons.1.0.14 jar dosyası ekledi bu yüzden jcommons kaldırmak ve benim için çalışıyor


0

dosyaya yaz:

{Wildfly-home}\modules\system\layers\base\org\picketbox\main 

sonra bağımlılıklara: <module name="sun.jdk"/>


-1

Benim durumumda, aşağıdaki yığın izlemeyle doğrulama hatası alıyordum

jasperreports-server-cp-6.4.0-bin\buildomatic\build.xml:61: The following error occurred while executing this line:
TIB_js-jrs-cp_6.4.0_bin\jasperreports-server-cp-6.4.0-bin\buildomatic\bin\setup.xml:320: java.lang.VerifyError: (class: org/apache/commons/codec/binary/Base64OutputStream, method: <init> signature: (Ljava/io/OutputStream;ZI[B)V) Incompatible argument to function
    at com.jaspersoft.jasperserver.crypto.KeystoreManager.createKeystore(KeystoreManager.java:257)
    at com.jaspersoft.jasperserver.crypto.KeystoreManager.init(KeystoreManager.java:224)
    at com.jaspersoft.buildomatic.crypto.KeystoreTask.execute(KeystoreTask.java:64)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:169)
    at org.apache.tools.ant.taskdefs.ImportTask.importResource(ImportTask.java:222)
    at org.apache.tools.ant.taskdefs.ImportTask.execute(ImportTask.java:163)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:180)
    at org.apache.tools.ant.ProjectHelper.configureProject(ProjectHelper.java:93)
    at org.apache.tools.ant.Main.runBuild(Main.java:826)
    at org.apache.tools.ant.Main.startAnt(Main.java:235)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Commons-codec-1.3.jar için sınıfyolu girişini kaldırarak çözdüm, Jasper ile birlikte gelen bu kavanoz sürümünde bir uyumsuzluk vardı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.