Causas de obtener un java.lang.VerifyError


Estoy investigando lo siguiente 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)

Ocurre cuando se inicia el servidor jboss en el que se implementa el servlet. Está compilado con jdk-1.5.0_11 y traté de compilar con jdk-1.5.0_15 sin éxito. Esa es la compilación funciona bien, pero cuando se implementa, el java.lang.VerifyError ocurre.

Cuando cambié el nombre del método y obtuve el siguiente error:

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)

Puede ver que se muestra más de la firma del método.

El método actual la firma es

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

Ya intenté mirarlo con javap y eso da la firma del método como debería ser.

Cuando mis otros colegas comprueban el código, lo compilan y lo despliegan, tienen el mismo problema. Cuando el servidor de compilación recoge el código y lo implementa en entornos de desarrollo o pruebas (HPUX), se produce el mismo error. También una máquina de prueba automatizada que ejecuta Ubuntu muestra el mismo error durante el inicio del servidor.

El resto de la aplicación se ejecuta bueno, sólo que un servlet está fuera de servicio. Cualquier idea de dónde buscar sería útil.

Author: Kevin Panko, 2008-09-19

23 answers

java.lang.VerifyError puede ser el resultado cuando se ha compilado en una biblioteca diferente de la que está utilizando en tiempo de ejecución.

Por ejemplo, esto me sucedió al intentar ejecutar un programa que fue compilado contra Xerces 1, pero Xerces 2 fue encontrado en el classpath. Las clases requeridas (en el espacio de nombres org.apache.*) se encontraron en tiempo de ejecución, por lo que ClassNotFoundException fue no el resultado. Ha habido cambios en las clases y métodos, por lo que las firmas de método encontradas en tiempo de ejecución no coincidían con lo que estaba allí en tiempo de compilación.

Normalmente, el compilador marcará los problemas donde las firmas de los métodos no coinciden. La JVM verificará el bytecode de nuevo cuando se cargue la clase, y lanza VerifyError cuando el bytecode está tratando de hacer algo que no debería ser permitido calling por ejemplo, llamando a un método que devuelve String y luego almacena ese valor devuelto en un campo que contiene un List.

 176
Author: Kevin Panko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 15:44:02

java.lang.VerifyError son los peores.

Obtendría este error si el tamaño del código de bytes de su método excede el límite de 64kb; pero probablemente lo habría notado.

¿Está 100% seguro de que esta clase no está presente en el classpath en otra parte de su aplicación, tal vez en otro jar?

También, desde su stacktrace, es la codificación de caracteres del archivo fuente (utf-8?) ¿Es correcto?

 19
Author: p3t0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-22 12:34:15

Como dijo Kevin Panko, es principalmente debido al cambio de biblioteca. Así que en algunos casos un "limpio" del proyecto (directorio) seguido de una compilación hace el truco.

 10
Author: Flow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 17:15:01

Solucioné este error en Android al hacer que el proyecto que estaba importando una biblioteca, como se describe aquí http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject

Anteriormente, solo estaba haciendo referencia al proyecto (no convirtiéndolo en una biblioteca) y estaba obteniendo este extraño VerifyError.

Espero que ayude a alguien.

 8
Author: Tiago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-13 00:17:57

Una cosa que puede intentar es usar -Xverify:all que verificará el bytecode al cargarse y a veces da mensajes de error útiles si el bytecode no es válido.

 7
Author: Alex Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-27 13:26:58

VerifyError significa que el archivo de clase contiene bytecode que es sintácticamente correcto pero viola alguna restricción semántica, por ejemplo, un objetivo de salto que cruza los límites del método.

Básicamente, un VerifyError solo puede ocurrir cuando hay un error en el compilador, o cuando el archivo de clase se corrompe de alguna otra manera (por ejemplo, a través de RAM defectuosa o un HD defectuoso).

Intente compilar con una versión JDK diferente y en una máquina diferente.

 7
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 07:58:38

En mi caso mi proyecto Android depende de otro proyecto Java compilado para Java 7. java.lang.VerifyError desapareció después de que cambié el Nivel de Cumplimiento del Compilador de ese proyecto Java a 6.0

Más tarde descubrí que este es un problema Dalvik: https://groups.google.com/forum/?fromgroups#! topic / android-developers / sKsMTZ42pwE

 5
Author: Michal Vician,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-19 11:14:51

Estaba teniendo este problema debido a que pack200 destrozaba un archivo de clase. Un poco de búsqueda activó este error de java . Básicamente, establecer --effort=4 causó que el problema desapareciera.

Usando java 1.5.0_17 (aunque apareció en todas las variantes de java 1.5 que probé en).

 4
Author: Mike Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 22:27:15

He arreglado un java similar.lang.VerifyError problema mediante la sustitución de

        catch (MagickException e)

Con

        catch (Exception e)

Donde MagickException se definió en un proyecto de biblioteca (en el que mi proyecto tiene una dependencia).

Después de eso tengo un java.lang.NoClassDefFoundError acerca de una clase de la misma biblioteca (arreglado de acuerdo a https://stackoverflow.com/a/9898820/755804 ).

 2
Author: 18446744073709551615,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

Esto puede suceder en Android cuando se está tratando de cargar una biblioteca que se compiló contra JDK de Oracle.

Aquí está el problema para el cliente HTTP Async Ning.

 2
Author: Martin Konicek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 09:22:57

En mi caso tuve que eliminar este bloque:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Estaba mostrando un error cerca de la llamada al método Fragment.showDialog().

 2
Author: ViliusK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-27 16:19:19

Ejemplo Mínimo que genera el error

Una posibilidad simple es usar Jasmin, o editar manualmente el bytecode con un editor de archivos binarios.

Permite crear el método void sin una instrucción return (generada por la instrucción return; en Java), que el JVMS dice que es ilegal.

En Jasmin podríamos escribir: {[18]]}

.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

Luego hacemos javac Main.j y javap -v Main dice que hemos compilado: {[18]]}

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

Así que realmente no hay retorno instrucción.

Ahora si intentamos ejecutar java Main obtenemos:

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)

Este error nunca puede ocurrir normalmente en Java, ya que el compilador Java agrega un return implícito a void métodos para nosotros. Esta es la razón por la que no necesitamos agregar un return a nuestros métodos main. Puede comprobar esto con javap.

JVMS

VerifyError ocurre cuando intenta ejecutar ciertos tipos de archivos de clase ilegales como se especifica en JVMS 7 capítulo 4.5

El JVMS dice que cuando Java carga un archivo, debe ejecutar una serie de comprobaciones para ver que el archivo de clase está bien antes de ejecutarlo.

Tales errores no se pueden generar en un solo ciclo de compilación y ejecución de código Java, porque JVMS 7 4.10 dice :

Aunque un compilador para el lenguaje de programación Java solo debe producir archivos de clase que satisfagan todas las restricciones estáticas y estructurales [... ]

Así que para ver un ejemplo de fallo mínimo, necesitaremos generar la fuente código sin javac.

 2
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-06 17:13:52

Esta página puede darte algunas pistas - http://www.zanthan.com/itymbi/archives/000337.html

Puede haber un error sutil en el cuerpo de ese método que javac no detecta. Difícil de diagnosticar a menos que publiques todo el método aquí.

Usted podría comenzar declarando tantas variables como sea posible como final... eso habría atrapado el error mencionado en el sitio de zanthan, y a menudo es una buena práctica de todos modos.

 1
Author: Lars Westergren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 06:57:23

Bueno, en mi caso, mi proyecto A tenía una dependencia de otro, digamos X(A estaba usando algunas de las clases definidas en X). Así que cuando agregué X como un proyecto de referencia en la ruta de compilación de A, obtuve este error. Sin embargo, cuando eliminé X como el proyecto referenciado e incluí el jar de X como una de las bibliotecas, el problema se resolvió.

 1
Author: user2484130,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-31 15:03:54

Compruebe si hay varias versiones del mismo archivo jar en su classpath.

Por ejemplo, tenía opennlp-tools-1.3.0.jar y opennlp-tools-1.5.3.tarro en mi classpath y tengo este error. La solución fue eliminar opennlp-tools-1.3.0.frasco.

 1
Author: demongolem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-02 20:47:59

CGLIB 6 podría desencadenar errores similares, consulte "¿Debo actualizar a CGLIB 3.0?" and some commentary at Spring SPR-9669.

Esto es especialmente cierto cuando todo funciona bien en JRE 6 y simplemente cambiar a JRE7 rompe las cosas.

 1
Author: Alexander Wessel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:11

Otra razón para este error puede ser la combinación de AspectJ 6.

Ver Eclipse Bug 353467y Kieker ticket 307 para más detalles.

Esto es especialmente cierto cuando todo funciona bien en JRE 6 y pasar a JRE7 rompe las cosas.

 1
Author: Alexander Wessel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 01:31:48

También podría suceder cuando tiene muchas importaciones de módulos con maven. Habrá dos o más clases que tengan exactamente el mismo nombre (mismo nombre calificado). Este error es el resultado de la diferencia de interpretación entre el tiempo de compilación y el tiempo de ejecución.

 1
Author: Toumi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 12:09:09

Si está migrando a java7 o utilizando java7, generalmente se puede ver este error. Me enfrenté a los errores anteriores y luché mucho para averiguar la causa raíz, sugeriría que intente agregar "-XX:-UseSplitVerifier" argumento JVM mientras ejecuta su aplicación.

 1
Author: Ulhas N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-16 05:57:46

Aunque la razón mencionada por Kevin es correcta, pero definitivamente revisaría a continuación antes de pasar a otra cosa:

  1. Marca cglibs en mi classpath.
  2. Comprueba las versiones de hibernate en mi classpath.

Es muy probable que tener una versión múltiple o conflictiva de cualquiera de las anteriores pueda causar problemas inesperados como el en cuestión.

 0
Author: Sandeep Jindal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-24 17:13:17

Java.lang.VerifyError significa que su bytecode compilado se refiere a algo que Android no puede encontrar. Este VerifyError me emite solo con kitkat4.4 y la versión menor no en la versión anterior de que incluso ejecuté la misma compilación en ambos Dispositivos. cuando usé jackson json parser de la versión anterior que muestra java.lang.verifyerror

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.+'

Entonces he cambiado la Dependencia a la última versión 2.2 a 2.7 sin la biblioteca principal, entonces funciona. lo que significa los métodos y otros contenidos de core se migran a la última versión de Databind2.7. Esto soluciona mis problemas.

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
 0
Author: anand krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 12:20:56

Por favor, elimine cualquier archivo jar inutilizable e intente ejecutarlo. y su trabajo para mí he añadido un archivo jcommons jar y también otro jcommons.1.0.14 jar archivo para eliminar jcommons y su trabajo para mí

 0
Author: Jat Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 10:07:10

En mi caso, estaba obteniendo verify error con el siguiente seguimiento de pila

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)

Lo resolví eliminando la entrada classpath para commons-codec-1.3.jar, hubo un desajuste en la versión de este jar con el que viene con Jasper.

 -1
Author: Aashirwad Sinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 05:43:46