Arreglar Java.Lang.NoClassDefFoundError: No se pudo inicializar el error de clase

Mehvish Ashiq 12 octubre 2023
  1. Programa Java con el error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase
  2. Posibles causas del error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase
  3. Solución para erradicar el error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase
Arreglar Java.Lang.NoClassDefFoundError: No se pudo inicializar el error de clase

Hoy aprenderemos sobre otro error de tiempo de ejecución: el java.lang.noclassdeffounderror: no se pudo inicializar la clase. Primero, revisaremos un programa Java que tiene este error, lo que conducirá a la discusión sobre las posibles razones y descubriremos qué línea de código está causando este error.

Finalmente, también aprenderemos sobre la solución para eliminar este error.

Programa Java con el error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase

Código de ejemplo:

public class PropHolder {
  public static Properties prop;

  static {
    // write code to load the properties from a file
  }
}

Código de ejemplo:

import java.util.Properties;

public class Main {
  public static void main(String[] args) {
    // set your properties here
    // save the properties in a file
    //  Referencing the PropHolder.prop:
    Properties prop = PropHolder.prop;
    // print the values of all properties
  }
}

Aquí, tenemos dos clases .java llamadas PropHolder y Main. La clase PropHolder carga las propiedades del archivo especificado mientras que la clase Main las establece y las guarda en un archivo.

También hace referencia a la variable prop de la clase PropHolder para imprimir los valores de todas las propiedades.

Este código Java funciona bien cuando lo ejecutamos en nuestra máquina local, pero no funciona cuando se implementa en un servidor Linux con algún script. ¿Por que es esto entonces? Averigüemos las razones.

Posibles causas del error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase

En primer lugar, recuerda que obtener el java.lang.NoClassDefFoundError no solo significa que falta nuestra clase. Si es así, obtendremos la excepción java.lang.ClassNotFoundException.

Tampoco significa que falte el bytecode (.class) (en ese caso, obtendríamos un error como este java.lang.NoClassDefFoundError: classname).

Por lo tanto, el error java.lang.noclassdeffounderror: could not initialize class de nuestro servidor significa que no puede ubicar el archivo de clase. Puede ser causado por diferentes razones que se enumeran a continuación.

  1. El problema puede estar en el bloque estático (también llamado inicializador estático). Aparecería con una excepción no detectada, ocurriría y se propagaría hasta un ClassLoader real que intentara cargar una clase.

  2. Si la excepción no se debe al bloque estático, puede ser al crear una variable estática llamada PropHolder.prop.

  3. Posiblemente, la Clase no esté disponible en el CLASSPATH de Java especificado.

  4. Podríamos haber ejecutado nuestro programa Java usando el comando jar mientras la Clase no estaba definida en el atributo ClassPath del archivo MANIFEST.

  5. Este error puede deberse a un script de inicio que anula la variable de entorno CLASSPATH.

  6. Otra razón podría ser la falta de una dependencia. Por ejemplo, es posible que la biblioteca nativa no esté disponible porque NoClassDefFoundError es la clase secundaria de java.lang.LinkageError.

  7. También podemos buscar java.lang.ExceptionInInitializerError en nuestro archivo log porque existe la posibilidad de que NoClassDefFoundError esté ocurriendo debido a una falla en la inicialización “estática”.

  8. Si uno de ustedes está trabajando en el entorno J2EE, entonces la visibilidad de la Clase en diferentes ClassLoaders puede causar el error java.lang.NoClassDefFoundError.

  9. A veces, se debe a un error de versión de JRE/JDK.

  10. También puede ocurrir cuando compilamos algo en nuestra máquina con, digamos, OpenJDK versión 8.x.x. Presionamos/confirmamos, pero alguien más ha configurado su JAVA_HOME a alguna versión 11.x JDK.

    Aquí, podemos obtener ClassNotFoundError, NoClassDefFoundError, etc. Por lo tanto, es mejor verificar con qué JDK se ha compilado el programa.

Solución para erradicar el error Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase

En nuestro caso, el ClassLoader se encontró con el error al leer la definición de la clase cuando intentaba leer la clase. Entonces, poner un bloque try-catch dentro del inicializador estático resolverá el problema.

Recuerde, si estamos leyendo algunos archivos allí, será diferente de nuestro entorno local.

Código de ejemplo:

// import libraries
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

// PropHolder Class
public class PropHolder {
  // static variable of type Properties
  public static Properties prop;

  // static block, which loads the properties
  // from the specified file
  static {
    try {
      InputStream input = new FileInputStream("properties");
      prop = new Properties();
      prop.load(input);

    } catch (FileNotFoundException ex) {
      Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
      Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
    }
  } // end static block
} // end PropHolder class

En la clase anterior, creamos una variable estática llamada prop de tipo Propiedades, que usamos en el bloque estático. Dentro del bloque estático, creamos un objeto de FileInputStream, que obtiene los bytes de entrada de un archivo específico en el sistema de archivos.

A continuación, inicializamos la variable prop llamando al constructor de la clase Properties, que se utiliza para cargar las propiedades de un archivo específico. Recuerda, este bloque estático solo se ejecuta una vez que ejecutamos la aplicación.

Código de ejemplo:

// import libraries

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

// Main Class
public class Main {
  // main()
  public static void main(String[] args) {
    /*
    instantiate the Properties class, set various
    properties and store them in a given file
     */
    Properties prop = new Properties();
    prop.setProperty("db.url", "localhost");
    prop.setProperty("db.user", "user");
    prop.setProperty("db.password", "password");
    try {
      OutputStream output = new FileOutputStream("properties");
      prop.store(output, null);
    } catch (FileNotFoundException ex) {
      Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
      Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
    }

    /*
    reference the `PropHolder.prop` to access the values of
    the properties that we set previously
     */
    Properties obj = PropHolder.prop;
    System.out.println(obj.getProperty("db.url"));
    System.out.println(obj.getProperty("db.user"));
    System.out.println(obj.getProperty("db.password"));
  } // end main()
} // end Main

En la clase Principal, instanciamos la clase Propiedades para establecer valores para varias propiedades y guardarlos en el archivo especificado. A continuación, hacemos referencia a PropHolder.prop para acceder a los valores de las propiedades db.url, db.user y db.password e imprimirlos en la consola de salida del programa de la siguiente manera.

Producción :

localhost
user
password
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - Java Error