Arreglar Java.Lang.NoClassDefFoundError: No se pudo inicializar el error de clase
-
Programa Java con el error
Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase
-
Posibles causas del error
Java.Lang.NoClassDefFoundError: no se pudo inicializar la clase
-
Solución para erradicar el error
Java.Lang.NoClassDefFoundError: no se pudo inicializar la 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.
-
El problema puede estar en el bloque
estático
(también llamado inicializadorestático
). Aparecería con una excepción no detectada, ocurriría y se propagaría hasta unClassLoader
real que intentara cargar una clase. -
Si la excepción no se debe al bloque
estático
, puede ser al crear una variableestática
llamadaPropHolder.prop
. -
Posiblemente, la
Clase
no esté disponible en elCLASSPATH
de Java especificado. -
Podríamos haber ejecutado nuestro programa Java usando el comando
jar
mientras laClase
no estaba definida en el atributoClassPath
del archivoMANIFEST
. -
Este error puede deberse a un script de inicio que anula la variable de entorno
CLASSPATH
. -
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 dejava.lang.LinkageError
. -
También podemos buscar
java.lang.ExceptionInInitializerError
en nuestro archivolog
porque existe la posibilidad de queNoClassDefFoundError
esté ocurriendo debido a una falla en la inicialización “estática”. -
Si uno de ustedes está trabajando en el entorno J2EE, entonces la visibilidad de la
Clase
en diferentesClassLoaders
puede causar el errorjava.lang.NoClassDefFoundError
. -
A veces, se debe a un error de versión de JRE/JDK.
-
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
Artículo relacionado - Java Error
- Arreglar Java fue iniciado por el código de salida devuelto = 1
- Arreglar JAVA_HOME no se puede determinar a partir del error de registro en R
- Arreglar java.io.IOException: No queda espacio en el dispositivo en Java
- Arreglar Java.IO.NotSerializableException en Java
- Arreglar Java.Lang.IllegalStateException de Android: no se pudo ejecutar el método de la actividad