Причины получения java.lang.VerifyError - PullRequest
184 голосов
/ 19 сентября 2008

Я расследую следующее 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)

Это происходит при запуске сервера jboss, на котором развернут сервлет. Он скомпилирован с jdk-1.5.0_11, и я попытался перекомпилировать его с jdk-1.5.0_15 безуспешно. То есть компиляция выполняется нормально, но при развертывании возникает ошибка java.lang.VerifyError.

Когда я изменил имя метода и получил следующую ошибку:

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)

Вы видите, что отображается больше сигнатуры метода.

Фактическая сигнатура метода

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

Я уже пытался посмотреть на него с помощью javap, и это дает сигнатуру метода, как и должно быть.

Когда другие мои коллеги проверяют код, компилируют и развертывают его, у них возникает та же проблема. Когда сервер сборки берет код и развертывает его в средах разработки или тестирования (HPUX), возникает та же ошибка. Кроме того, автоматическая машина тестирования под управлением Ubuntu выдает ту же ошибку при запуске сервера.

Остальная часть приложения работает нормально, только один сервлет вышел из строя. Любые идеи, где искать, были бы полезны.

Ответы [ 23 ]

181 голосов
/ 25 марта 2010

java.lang.VerifyError может быть результатом, если вы скомпилировали против библиотеки, отличной от используемой во время выполнения.

Например, это случилось со мной, когда я пытался запустить программу, скомпилированную для Xerces 1, но Xerces 2 был найден в пути к классам. Обязательные классы (в org.apache.* пространстве имен) были найдены во время выполнения, поэтому ClassNotFoundException было , а не результатом. В классы и методы были внесены изменения, поэтому сигнатуры методов, найденные во время выполнения, не соответствовали тому, что было во время компиляции.

Обычно компилятор будет отмечать проблемы, когда сигнатуры методов не совпадают. JVM проверит байт-код еще раз, когда класс загружен, и выдает VerifyError, когда байт-код пытается сделать что-то, что не должно быть разрешено - например, вызывая метод, который возвращает String, а затем сохраняет это возвращаемое значение в поле, которое содержит List.

20 голосов
/ 19 сентября 2008

java.lang.VerifyError худшие.

Вы получите эту ошибку, если размер байт-кода вашего метода превысит ограничение в 64 КБ; но вы, вероятно, заметили бы это.

Вы на 100% уверены, что этот класс отсутствует в пути к классам в другом месте вашего приложения, может быть, в другом банке?

Также из вашей трассировки стека, является ли кодировка символов исходного файла (utf-8?) Это правильно?

10 голосов
/ 03 марта 2011

Как сказал Кевин Панко, это в основном из-за смены библиотеки. Так что в некоторых случаях «чистый» проект (каталог), сопровождаемый сборкой, делает свое дело.

8 голосов
/ 13 декабря 2012

Я исправил эту ошибку на Android, создав проект, в который импортировал библиотеку, как описано здесь http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject

Раньше я просто ссылался на проект (не делая его библиотекой) и получал этот странный VerifyError.

Надеюсь, это кому-нибудь поможет.

7 голосов
/ 11 января 2010

VerifyError означает, что файл класса содержит синтаксически правильный байт-код, но нарушает некоторые семантические ограничения, например, цель прыжка, которая пересекает границы метода.

По сути, VerifyError может возникать только в случае ошибки компилятора или когда файл класса поврежден каким-либо иным способом (например, из-за неисправного ОЗУ или неисправного HD).

Попробуйте скомпилировать с другой версией JDK и на другой машине.

7 голосов
/ 19 сентября 2008

Одна вещь, которую вы можете попробовать, - это использовать -Xverify:all, который будет проверять байт-код при загрузке и иногда выдает полезные сообщения об ошибках, если байт-код недействителен.

5 голосов
/ 19 мая 2013

В моем случае мой проект Android зависит от другого проекта Java, скомпилированного для Java 7. java.lang.VerifyError исчез после того, как я изменил уровень соответствия компилятора этого проекта Java на 6.0

Позже я узнал, что это проблема Dalvik: https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE

4 голосов
/ 28 мая 2009

Я получил эту проблему из-за pack200 искажения файла класса. Немного поиска перевернуло ошибку Java . По сути, установка --effort=4 привела к устранению проблемы.

Использование Java 1.5.0_17 (хотя оно появлялось в каждом варианте Java 1.5, в котором я пробовал).

2 голосов
/ 27 апреля 2014

В моем случае мне пришлось убрать этот блок:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Показывалось сообщение об ошибке около Fragment.showDialog() вызова метода.

2 голосов
/ 10 мая 2013

Это может произойти на Android, когда вы пытаетесь загрузить библиотеку, скомпилированную с использованием Oracle JDK.

Вот проблема для Ning Async HTTP-клиента.

...