with thread solucion problem dependent caused java noclassdeffounderror

thread - ¿Por qué obtengo un NoClassDefFoundError en Java?



nested exception is java lang noclassdeffounderror (19)

Dos copias de pago diferentes del mismo proyecto.

En mi caso, el problema fue la incapacidad de Eclipse para diferenciar entre dos copias diferentes del mismo proyecto. Tengo una bloqueada en el troncal (control de versión SVN) y la otra trabajando en una rama a la vez. Probé un cambio en la copia de trabajo como un caso de prueba de JUnit, que incluía la extracción de una clase interna privada para que fuera una clase pública por su cuenta y mientras estaba trabajando, abro la otra copia del proyecto para mirar a mi alrededor a otra Parte del código que necesitaba cambios. En algún momento, el NoClassDefFoundError apareció quejándose de que la clase interna privada no estaba allí; Al hacer doble clic en la traza de la pila, llegué al archivo de origen en la copia de proyecto incorrecta.

Al cerrar la copia troncal del proyecto y ejecutar el caso de prueba nuevamente se eliminó el problema.

NoClassDefFoundError un NoClassDefFoundError cuando ejecuto mi aplicación Java. ¿Cuál es la causa típica de esto?


Aquí está el código para ilustrar java.lang.NoClassDefFoundError . Por favor, vea la respuesta de Jared para una explicación detallada.

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo { public static void main(String[] args) { try { // The following line would throw ExceptionInInitializerError SimpleCalculator calculator1 = new SimpleCalculator(); } catch (Throwable t) { System.out.println(t); } // The following line would cause NoClassDefFoundError SimpleCalculator calculator2 = new SimpleCalculator(); } }

SimpleCalculator.java

public class SimpleCalculator { static int undefined = 1 / 0; }


Asegúrese de que esto coincida en el module:app y module:lib :

android { compileSdkVersion 23 buildToolsVersion ''22.0.1'' packagingOptions { } defaultConfig { minSdkVersion 17 targetSdkVersion 23 versionCode 11 versionName "2.1" }


En caso de que haya generado código (EMF, etc.), puede haber demasiados inicializadores estáticos que consumen todo el espacio de pila.

Ver pregunta de desbordamiento de pila ¿ Cómo aumentar el tamaño de la pila de Java? .


Esta es la mejor solución que he encontrado hasta ahora.

Supongamos que tenemos un paquete llamado org.mypackage contiene las clases:

  • HelloWorld (clase principal)
  • Clase de apoyo
  • UtilClass

y los archivos que definen este paquete se almacenan físicamente en el directorio D:/myprogram (en Windows) o en /home/user/myprogram (en Linux).

La estructura del archivo se verá así:

Cuando invocamos Java, especificamos el nombre de la aplicación para ejecutar: org.mypackage.HelloWorld . Sin embargo, también debemos indicar a Java dónde buscar los archivos y directorios que definen nuestro paquete. Entonces para lanzar el programa, tenemos que usar el siguiente comando:


Estaba utilizando Spring Framework con Maven y solucioné este error en mi proyecto.

Hubo un error de tiempo de ejecución en la clase. Estaba leyendo una propiedad como entero, pero cuando leyó el valor del archivo de propiedades, su valor era el doble.

Spring no me dio un seguimiento completo de la pila en qué línea falló el tiempo de ejecución. Simplemente dijo NoClassDefFoundError . Pero cuando lo ejecuté como una aplicación Java nativa (sacándolo de MVC), le dio a ExceptionInInitializerError cuál fue la verdadera causa y cómo es que rastreé el error.

La respuesta de @xli me dio una idea de lo que puede estar mal en mi código.


Este error puede ser causado por requisitos de versión de Java sin marcar .

En mi caso, pude resolver este error, mientras construía un proyecto de código abierto de alto perfil, cambiando de Java 9 a Java 8 usando SDKMAN! .

sdk list java sdk install java 8u152-zulu sdk use java 8u152-zulu

Luego hacer una instalación limpia como se describe a continuación.

Al usar Maven como su herramienta de compilación, a veces es útil, y generalmente gratificante, hacer una compilación de ''instalación'' limpia con la prueba deshabilitada .

mvn clean install -DskipTests

Ahora que todo se ha construido e instalado, puede seguir adelante y ejecutar las pruebas.

mvn test


Esto se produce cuando hay un archivo de clase del que depende su código y está presente en tiempo de compilación pero no se encuentra en tiempo de ejecución. Busque las diferencias en el tiempo de compilación y las rutas de clase de tiempo de ejecución.


He encontrado que a veces me sale un error NoClassDefFound cuando el código se compila con una versión incompatible de la clase encontrada en el tiempo de ejecución. La instancia específica que recuerdo es con la biblioteca de ejes de apache. En realidad, había 2 versiones en mi classpath de tiempo de ejecución y estaba recogiendo la versión obsoleta e incompatible y no la correcta, causando un error NoClassDefFound. Esto estaba en una aplicación de línea de comandos donde estaba usando un comando similar a este.

set classpath=%classpath%;axis.jar

Pude hacer que tomara la versión correcta usando:

set classpath=axis.jar;%classpath%;


Java no pudo encontrar la clase A en tiempo de ejecución. La clase A estaba en el proyecto ArtClient de Maven desde un espacio de trabajo diferente. Así que importé ArtClient a mi proyecto Eclipse. Dos de mis proyectos estaban usando ArtClient como dependencia. Cambié la referencia de la biblioteca a la referencia del proyecto para estos (Build Path -> Configure Build Path).

Y el problema desapareció.


La siguiente técnica me ayudó muchas veces:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

donde TheNoDefFoundClass es la clase que se puede "perder" debido a una preferencia por una versión anterior de la misma biblioteca que utiliza su programa. Esto ocurre con mayor frecuencia en los casos en que el software cliente se implementa en un contenedor dominante, armado con sus propios cargadores de clases y toneladas de versiones antiguas de las librerías más populares.


Obtengo NoClassFoundError cuando las clases cargadas por el cargador de clases en tiempo de ejecución no pueden acceder a las clases que ya están cargadas por el java rootloader. Debido a que los diferentes cargadores de clases están en diferentes dominios de seguridad (de acuerdo con java), jvm no permitirá que las clases ya cargadas por el cargador de raíz se resuelvan en el espacio de direcciones del cargador de tiempo de ejecución.

Ejecute su programa con ''java -javaagent: tracer.jar [SUS ARGS de java]''

Produce una salida que muestra la clase cargada y el env del cargador que cargó la clase. Es muy útil rastrear por qué una clase no se puede resolver.

// ClassLoaderTracer.java // From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5 import java.lang.instrument.*; import java.security.*; // manifest.mf // Premain-Class: ClassLoadTracer // jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class // java -javaagent:tracer.jar [...] public class ClassLoadTracer { public static void premain(String agentArgs, Instrumentation inst) { final java.io.PrintStream out = System.out; inst.addTransformer(new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString(); out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd); // dump stack trace of the thread loading class Thread.dumpStack(); // we just want the original .class bytes to be loaded! // we are not instrumenting it... return null; } }); } }


Recibí este mensaje después de eliminar dos archivos de la biblioteca SRC, y cuando los traje, seguí viendo este mensaje de error.

Mi solución fue: Reiniciar Eclipse. Desde entonces no he vuelto a ver este mensaje :-)


Si alguien viene aquí debido a java.lang.NoClassDefFoundError: org/apache/log4j/Logger error, en mi caso se produjo porque usé log4j 2 (pero no agregué todos los archivos que vienen con él), y algunos la biblioteca de dependencias usó log4j 1. La solución fue agregar el puente Log4j 1.x: jar log4j-1.2-api-<version>.jar que viene con log4j 2. Más información sobre la migration log4j 2.


Si bien es posible que esto se deba a una falta de coincidencia de la ruta de clase entre el tiempo de compilación y el tiempo de ejecución, no es necesariamente cierto.

En este caso, es importante tener en mente dos o tres excepciones diferentes:

  1. java.lang.ClassNotFoundException Esta excepción indica que la clase no se encontró en la ruta de clase. Esto indica que estábamos intentando cargar la definición de clase y que la clase no existía en la ruta de clase.

  2. java.lang.NoClassDefFoundError Esta excepción indica que la JVM buscó en la estructura de datos de definición de clase interna la definición de una clase y no la encontró. Esto es diferente a decir que no se pudo cargar desde el classpath. Por lo general, esto indica que anteriormente intentamos cargar una clase desde la ruta de clase, pero falló por algún motivo; ahora estamos tratando de usar la clase nuevamente (y por lo tanto necesitamos cargarla, ya que falló la última vez), pero '' Ni siquiera voy a intentar cargarlo, porque no lo cargamos antes (y sospechamos razonablemente que volveríamos a fallar). El error anterior podría ser una excepción ClassNotFoundException o ExceptionInInitializerError (que indica un error en el bloque de inicialización estática) o cualquier otro problema. El punto es que un NoClassDefFoundError no es necesariamente un problema de classpath.


Solucioné mi problema al deshabilitar las bibliotecas preDex para todos los módulos:

dexOptions { preDexLibraries false ...


Tuve el mismo problema, y ​​estuve en stock por muchas horas.

Encontré la solución. En mi caso, se definió el método estático debido a eso. La JVM no puede crear el otro objeto de esa clase.

Por ejemplo,

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");


NoClassDefFoundError también puede ocurrir cuando algún recurso no está disponible en tiempo de ejecución, por ejemplo, un archivo de propiedades que la clase afectada intenta cargar desde el directorio META-INF . Si no NoClassDefFoundError , a veces no podrá ver el seguimiento completo de la pila; Para superar esto, puedes usar temporalmente una cláusula catch para Throwable :

try { // Statement(s) that cause the affected class to be loaded } catch (Throwable t) { Logger.getLogger("<logger-name>").info("Loading my class went wrong", t); }


NoClassDefFoundError en Java

Definición:

  1. Java Virtual Machine no puede encontrar una clase particular en tiempo de ejecución que estaba disponible en tiempo de compilación.

  2. Si una clase estuvo presente durante el tiempo de compilación pero no estaba disponible en java classpath durante el tiempo de ejecución.

Ejemplos:

  1. La clase no está en Classpath, no hay una forma segura de saberlo, pero muchas veces solo puede echar un vistazo para imprimir System.getproperty ("java.classpath") y se imprimirá el classpath desde allí, al menos puede obtener una idea de su ruta de clase de tiempo de ejecución real.
  2. Un ejemplo simple de NoClassDefFoundError es clase pertenece a un archivo JAR faltante o JAR no se agregó a classpath o, a veces, el nombre de jar ha sido cambiado por alguien como, en mi caso, uno de mis colegas ha cambiado tibco.jar por tibco_v3.jar y el programa es fallando con java.lang.NoClassDefFoundError y me preguntábamos qué está mal.

  3. Solo intente ejecutar con la opción explícitamente -classpath con la ruta de clase que cree que funcionará y si funciona, entonces es una señal breve de que alguien está anulando la ruta de clase Java.

  4. El problema de permisos en el archivo JAR también puede causar NoClassDefFoundError en Java.
  5. El error tipográfico en la configuración XML también puede causar NoClassDefFoundError en Java.
  6. cuando su clase compilada, que está definida en un paquete, no aparece en el mismo paquete mientras se carga, como en el caso de JApplet, lanzará NoClassDefFoundError en Java.

Soluciones posibles:

  1. La clase no está disponible en Java Classpath.
  2. Si está trabajando en un entorno J2EE, la visibilidad de Clase entre múltiples Classloader también puede causar java.lang.NoClassDefFoundError, vea ejemplos y la sección de escenarios para una discusión detallada.
  3. Busque java.lang.ExceptionInInitializerError en su archivo de registro. NoClassDefFoundError debido a la falla de la inicialización estática es bastante común.
  4. Debido a que NoClassDefFoundError es una subclase de java.lang.LinkageError, también puede aparecer si una de sus dependencias, como la biblioteca nativa, puede no estar disponible.
  5. Cualquier secuencia de comandos de inicio está anulando la variable de entorno Classpath.
  6. Es posible que esté ejecutando su programa usando el comando jar y la clase no se definió en el atributo ClassPath del archivo de manifiesto.

Recursos:

3 maneras de resolver NoClassDefFoundError

java.lang.NoClassDefFoundError Patrones de problemas