Saya sedang menyelidiki yang berikut ini 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)
Ini terjadi ketika server jboss di mana servlet digunakan dimulai. Itu dikompilasi dengan jdk-1.5.0_11 dan saya mencoba untuk mengkompilasi ulang dengan jdk-1.5.0_15 tanpa berhasil. Itu adalah kompilasi berjalan dengan baik tetapi ketika digunakan, java.lang.VerifyError terjadi.
Ketika saya mengubah nama metode dan mendapat kesalahan berikut:
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)
Anda dapat melihat bahwa lebih banyak metode tanda tangan ditampilkan.
Tanda tangan metode aktual adalah
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
Saya sudah mencoba melihatnya dengan javap
dan itu memberikan metode tanda tangan sebagaimana mestinya.
Ketika kolega saya yang lain memeriksa kode, mengkompilasinya dan menyebarkannya, mereka memiliki masalah yang sama. Ketika server build mengambil kode dan menyebarkannya pada pengembangan atau lingkungan pengujian (HPUX), kesalahan yang sama terjadi. Juga mesin pengujian otomatis yang menjalankan Ubuntu menunjukkan kesalahan yang sama selama startup server.
Sisa aplikasi berjalan dengan baik, hanya satu servlet yang rusak. Setiap ide ke mana harus mencari akan sangat membantu.
sumber
Jawaban:
java.lang.VerifyError
bisa menjadi hasil ketika Anda telah dikompilasi terhadap pustaka yang berbeda dari yang Anda gunakan saat runtime.Sebagai contoh, ini terjadi pada saya ketika mencoba menjalankan program yang dikompilasi melawan Xerces 1, tetapi Xerces 2 ditemukan di classpath. Kelas yang diperlukan (di
org.apache.*
namespace) ditemukan pada saat runtime, jadiClassNotFoundException
itu tidak hasilnya. Ada perubahan pada kelas dan metode, sehingga tanda tangan metode yang ditemukan saat runtime tidak cocok dengan apa yang ada di waktu kompilasi.Biasanya, kompiler akan menandai masalah di mana tanda tangan metode tidak cocok. JVM akan memverifikasi bytecode lagi ketika kelas dimuat, dan melempar
VerifyError
ketika bytecode mencoba melakukan sesuatu yang tidak boleh diizinkan - misalnya memanggil metode yang mengembalikanString
dan kemudian menyimpan nilai yang dikembalikan dalam bidang yang menampung aList
.sumber
-verbose:class
dan kemudian cari kelas sebelum memuatjava.lang.VerifyError
. Ini akan memiliki jalur ke JAR. Gunakanjavap
dan bandingkan dengan kelas yang Anda kompilasi. Saya menemukan ini berguna karena kelas yang dilaporkan dalam kesalahan itu bukan penyebabnya sebenarnya adalah salah satu argumen.java.lang.VerifyError
adalah yang terburuk.Anda akan mendapatkan kesalahan ini jika ukuran bytecode metode Anda melebihi batas 64kb; tetapi Anda mungkin akan memperhatikan itu.
Apakah Anda 100% yakin kelas ini tidak ada di classpath di tempat lain dalam aplikasi Anda, mungkin di toples lain?
Juga, dari stacktrace Anda, apakah pengkodean karakter file sumber (
utf-8
?) Apakah itu benar?sumber
Seperti yang dikatakan Kevin Panko, itu sebagian besar karena perubahan perpustakaan. Jadi dalam beberapa kasus "bersih" dari proyek (direktori) diikuti oleh build yang berfungsi.
sumber
Satu hal yang mungkin Anda coba adalah menggunakan
-Xverify:all
bytecode yang akan memverifikasi saat memuat dan terkadang memberikan pesan kesalahan yang bermanfaat jika bytecode tidak valid.sumber
Saya memperbaiki kesalahan ini di Android dengan membuat proyek saya mengimpor perpustakaan, seperti dijelaskan di sini http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
Sebelumnya, saya hanya merujuk proyek (tidak menjadikannya perpustakaan) dan saya mendapatkan VerifyError yang aneh ini.
Semoga ini bisa membantu seseorang.
sumber
VerifyError berarti file kelas berisi bytecode yang benar secara sintaksis tetapi melanggar beberapa pembatasan semantik misalnya target lompatan yang melintasi batas metode.
Pada dasarnya, VerifyError hanya dapat terjadi ketika ada bug kompiler, atau ketika file kelas rusak dalam beberapa cara lain (misalnya melalui RAM yang rusak atau HD yang gagal).
Coba kompilasi dengan versi JDK yang berbeda dan pada mesin yang berbeda.
sumber
Dalam kasus saya, proyek Android saya bergantung pada proyek Java lain yang dikompilasi untuk Java 7.
java.lang.VerifyError
menghilang setelah saya mengubah Level Kepatuhan Penyusun proyek Java tersebut menjadi 6.0Kemudian saya mengetahui bahwa ini adalah masalah Dalvik: https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE
sumber
Saya mendapatkan masalah ini karena mengemas 200 file kelas. Sedikit pencarian mengubah bug java ini . Pada dasarnya, pengaturan
--effort=4
menyebabkan masalah hilang.Menggunakan java 1.5.0_17 (meskipun dipotong di setiap varian tunggal java 1.5, saya mencobanya).
sumber
Saya telah memperbaiki masalah java.lang.VerifyError serupa dengan mengganti
dengan
dimana
MagickException
didefinisikan dalam proyek perpustakaan (di mana proyek saya memiliki ketergantungan).Setelah itu saya mendapat
java.lang.NoClassDefFoundError
kelas tentang dari perpustakaan yang sama (diperbaiki menurut https://stackoverflow.com/a/9898820/755804 ).sumber
Ini bisa terjadi di Android ketika Anda mencoba memuat pustaka yang dikompilasi dengan JDK Oracle.
Inilah masalah untuk klien HTTP Ning Async.
sumber
Dalam kasus saya, saya harus menghapus blok ini:
Itu menunjukkan kesalahan di dekat
Fragment.showDialog()
pemanggilan metode.sumber
Contoh minimal yang menghasilkan kesalahan
Satu kemungkinan sederhana adalah menggunakan Jasmin , atau mengedit bytecode secara manual dengan editor file biner.
Mari kita membuat
void
metode tanpareturn
instruksi (dihasilkan olehreturn;
pernyataan di Jawa), yang menurut JVMS adalah ilegal.Di Jasmin kita bisa menulis:
Kami kemudian melakukan
javac Main.j
danjavap -v Main
mengatakan bahwa kami telah menyusun:jadi sungguh tidak ada instruksi pengembalian.
Sekarang jika kita mencoba menjalankan
java Main
kita mendapatkan:Kesalahan ini tidak pernah bisa terjadi di Jawa biasanya, karena compiler Java menambahkan implisit
return
untukvoid
metode bagi kita. Inilah sebabnya kami tidak perlu menambahkan metodereturn
kamimain
. Anda dapat memeriksanya denganjavap
.JVMS
VerifyError terjadi ketika Anda mencoba menjalankan beberapa jenis file kelas ilegal seperti yang ditentukan oleh JVMS 7 bab 4.5
JVMS mengatakan bahwa ketika Java memuat file, ia harus menjalankan serangkaian pemeriksaan untuk melihat bahwa file kelas OK sebelum menjalankannya.
Kesalahan seperti itu tidak dapat dihasilkan pada satu kompilasi dan menjalankan siklus kode Java, karena JVMS 7 4.10 mengatakan :
Jadi untuk melihat contoh kegagalan minimal, kita perlu membuat kode sumber tanpa
javac
.sumber
Halaman ini dapat memberi Anda beberapa petunjuk - http://www.zanthan.com/itymbi/archives/000337.html
Mungkin ada bug halus dalam tubuh metode itu yang gagal ditemukan javac. Sulit didiagnosis kecuali Anda memposting seluruh metode di sini.
Anda bisa mulai dengan mendeklarasikan variabel sebanyak mungkin sebagai final ... yang akan menangkap bug yang disebutkan di situs zanthan, dan seringkali merupakan praktik yang baik.
sumber
Nah dalam kasus saya, proyek saya A memiliki ketergantungan pada yang lain, katakanlah X (A menggunakan beberapa kelas yang didefinisikan dalam X). Jadi ketika saya menambahkan X sebagai proyek referensi di jalur build A, saya mendapatkan kesalahan ini. Namun ketika saya menghapus X sebagai proyek yang dirujuk dan memasukkan tabung X sebagai salah satu perpustakaan, masalahnya terpecahkan.
sumber
Periksa beberapa versi file jar yang sama di classpath Anda.
Sebagai contoh, saya memiliki opennlp-tools-1.3.0.jar dan opennlp-tools-1.5.3.jar di classpath saya dan mendapatkan kesalahan ini. Solusinya adalah menghapus opennlp-tools-1.3.0.jar.
sumber
CGLIB <2.2 dengan JRE> 6 dapat memicu kesalahan serupa, lihat "Haruskah saya meningkatkan ke CGLIB 3.0?" dan beberapa komentar di Spring SPR-9669 .
Ini terutama benar ketika semuanya bekerja dengan baik pada JRE 6 dan hanya beralih ke JRE7 merusak segalanya.
sumber
Alasan lain untuk kesalahan ini adalah kombinasi AspectJ <= 1.6.11 dengan JRE> 6.
Lihat Eclipse Bug 353467 dan Kieker tiket 307 untuk detailnya.
Ini terutama benar ketika semuanya bekerja dengan baik pada JRE 6 dan pindah ke JRE7 merusak segalanya.
sumber
Itu juga bisa terjadi ketika Anda memiliki banyak modul impor dengan pakar. Akan ada dua atau lebih kelas yang memiliki nama yang persis sama (nama yang memenuhi syarat sama). Kesalahan ini dihasilkan dari perbedaan interpretasi antara waktu kompilasi dan runtime.
sumber
Jika Anda bermigrasi ke java7 atau menggunakan java7 maka secara umum kesalahan ini dapat dilihat. Saya menghadapi kesalahan di atas dan banyak berjuang untuk mencari tahu penyebab utama, saya akan menyarankan untuk mencoba menambahkan argumen "-XX: -UseSplitVerifier" JVM saat menjalankan aplikasi Anda.
sumber
Setelah memperbarui
Gradle
di Android Studio 3.6.1 crash terjadi pada API 19 dalam rilis rilis.Ada kesalahan
Glide
perpustakaan . Solusi adalah menulis ulang proguard-rules.txt .Juga menurunkan versi
Gradle
(classpath 'com.android.tools.build:gradle:3.5.3'
), tetapi ini adalah solusi yang sudah ketinggalan zaman, jangan gunakan itu.sumber
Meskipun alasan yang disebutkan oleh Kevin benar, tapi saya pasti akan memeriksa di bawah sebelum pindah ke sesuatu yang lain:
cglibs
di classpath saya.hibernate
versi di classpath saya.Kemungkinannya bagus bahwa memiliki beberapa versi atau yang bertentangan dari salah satu di atas dapat menyebabkan masalah tak terduga seperti yang dipertanyakan.
sumber
java.lang.VerifyError berarti bytecode kompilasi Anda merujuk ke sesuatu yang tidak dapat ditemukan Android. Ini memverifikasi saya Masalah hanya saya dengan kitkat4.4 dan versi lebih rendah tidak dalam versi di atas bahkan saya menjalankan build yang sama di kedua Perangkat. ketika saya menggunakan parser jackson json dari versi yang lebih lama itu menunjukkan java.lang.verifyerror
Kemudian saya telah mengubah Ketergantungan ke versi terbaru 2.2 ke 2.7 tanpa perpustakaan inti , lalu berfungsi. yang berarti Metode dan konten inti lainnya dimigrasikan ke versi terbaru Databind2.7 . Ini memperbaiki Masalah saya.
sumber
harap hapus file jar yang tidak dapat digunakan dan coba jalankan. dan itu berfungsi untuk saya, saya menambahkan file jar jcommons dan juga file jar jcommons.1.0.14 lainnya jadi hapus jcommons dan itu berfungsi untuk saya
sumber
tulis di file:
ke dalam dependensi berikutnya:
<module name="sun.jdk"/>
sumber
Dalam kasus saya, saya mendapatkan kesalahan verifikasi dengan jejak stack di bawah ini
Saya menyelesaikannya dengan menghapus entri classpath untuk commons-codec-1.3.jar, ada ketidakcocokan dalam versi jar ini dengan yang datang dengan Jasper.
sumber