Java.lang.NoClassDefFoundError: No se pudo inicializar la clase XXX


public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;

class PropHolder es una clase propia. La clase reside en el mismo archivo JAR de la clase principal. Por lo que no debería porque falta cualquier JAR de classpath.

Cuando miro el archivo JAR de jar tf myjarfile, puedo ver el PropHolder.class listado allí.

Por cierto: el código se está ejecutando bien en mi máquina local. Pero no podía funcionar cuando lo despliego con algún script en un servidor Linux. Así que creo que no es el problema del código. Pero por alguna razón. el proceso de implementación es muy difícil de pista.

¿Cuál podría ser el problema?

Author: Erik Allik, 2011-09-07

7 answers

Mi mejor apuesta es que hay un problema aquí:

static {
    //code for loading properties from file
}

Parecería que se produjo alguna excepción no capturada y se propagó hasta el cargador de clases real intentando cargar la clase. Necesitaríamos un stacktrace para confirmar esto.

Eso o ocurrió al crear PropHolder.prop variable estática.

 151
Author: John Vint,
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-12 05:59:20

Usted está recibiendo un java.lang.NoClassDefFoundError que NO significa que su clase está ausente (en ese caso usted obtendría un java.lang.ClassNotFoundException). El ClassLoader se encontró con un error al leer la definición de la clase al intentar leer la clase.

Pon un try/catch dentro de tu inicializador estático y mira la excepción. Si lee algunos archivos allí y difiere de su entorno local es muy probable que la causa del problema (tal vez el archivo no se puede encontrar, no hay permisos, etc.).

 95
Author: jeha,
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-06 20:48:10

NoClassDefFoundError no da mucha idea de lo que salió mal dentro del bloque estático. Es una buena práctica tener siempre un bloque como este dentro de static { ... } código de inicialización:

static {
  try {

    ... your init code here

  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}
 25
Author: Mark Hansen,
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-06-05 02:48:50

Tuve la misma excepción, así es como resolví el problema:

Condiciones previas:

  1. Clase Junit (y prueba), que extendió otra clase.

  2. ApplicationContext inicializado usando spring, que inicia el proyecto.

  3. El contexto de la aplicación se inicializó en el método @Before

Solución:

Inicie el contexto de la aplicación desde el método @BeforeClass, ya que la clase padre también requiere clases inicializadas desde el contexto de la aplicación.

Espero que esto ayude.

 2
Author: KerenSi,
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-07 16:09:47

Como se mencionó anteriormente, esto podría ser una serie de cosas. En mi caso tenía una variable inicializada estáticamente que dependía de una entrada faltante en mi archivo de propiedades. Se agregó la entrada que faltaba al archivo de propiedades y el problema se resolvió.

 0
Author: TriMix,
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-17 19:46:52

Hace solo unos días, me encontré con la misma pregunta que la suya. Todo el código funciona bien en mi máquina local, pero resulta un error (noclassdeffound&initialize). Así que posteo mi solución, pero no se por qué, simplemente adelanto una posibilidad. Espero que alguien lo explique.@ John Vint Primero, te mostraré mi problema. Mi código tiene variable estática y bloque estático ambos. Cuando conocí este problema por primera vez, probé la solución de John Vint, y traté de atrapar la excepción. Sin embargo, no atrapé nada. Tan Pensé que es porque la variable estática (pero ahora sé que son la misma cosa) y todavía no encontré nada. Por lo tanto, trato de encontrar la diferencia entre la máquina linux y mi computadora. Luego descubrí que este problema ocurre solo cuando se ejecutan varios subprocesos en un proceso(Por cierto, la máquina linux tiene núcleos dobles y procesos dobles). Eso significa que si hay dos tareas (ambas usan el código que tiene bloque estático o variables) que se ejecutan en el mismo proceso, va mal, pero si se ejecutan en diferentes procesos, ambos están bien. En la máquina Linux, uso

mvn -U clean  test -Dtest=path 

Para ejecutar una tarea, y porque mi variable estática es iniciar un contenedor(o tal vez inicializar un nuevo classloader), por lo que permanecerá hasta que la jvm se detenga, y la jvm se detenga solo cuando todas las tareas en un proceso se detengan. Cada tarea iniciará un nuevo contenedor (o classloader) y confundirá la jvm. Como resultado, ocurre el error. Entonces, ¿cómo resolverlo? Mi solución es agregar un nuevo comando al comando maven, y hacer cada tarea va al mismo contenedor.

-Dxxx.version=xxxxx #sorry can't post more

Tal vez ya hayas resuelto este problema, pero aún así espero que ayude a otros que se encuentren con el mismo problema.

 0
Author: MonkeyKing,
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-10-28 03:51:56

Si estás trabajando en un proyecto de Android, asegúrate de no llamar a ningún método estático en ninguna clase de Android. Solo estoy usando JUnit + Mockito, así que tal vez algunos otros frameworks podrían ayudarte a evitar el problema por completo, no estoy seguro.

Mi problema era llamar a Uri.parse(uriString) como parte de un inicializador estático para una prueba unitaria. La clase Uri es una API de Android, por lo que la compilación de pruebas unitarias no pudo encontrarla. Cambié este valor a null en su lugar y todo volvió a la normalidad.

 0
Author: lifeson106,
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-12-12 23:47:37