Вопрос-ответ

Causes of getting a java.lang.VerifyError

Причины получения java.lang.VerifyError

Я расследую следующее 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.Возникает ошибка проверки.

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

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 показывает ту же ошибку при запуске сервера.

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

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

java.lang.VerifyError являются наихудшими.

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

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

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

Ответ 3

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

Ответ 4

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

java exception