¿Cómo resuelvo ClassNotFoundException?
Estoy intentando ejecutar una aplicación Java, pero aparece este error:
java.lang.ClassNotFoundException:
Después de los dos puntos viene la ubicación de la clase que falta. Sin embargo, sé que esa ubicación no existe ya que la clase se encuentra en otro lugar. ¿Cómo puedo actualizar la ruta de esa clase? ¿Tiene algo que ver con la ruta de clases?
Un classpath es una lista de ubicaciones desde las que cargar clases.
Estas 'ubicaciones' pueden ser directorios o archivos jar.
Para los directorios, la JVM seguirá un patrón esperado para cargar una clase. Si tengo el directorio C:/myproject/classes en mi classpath e intento cargar una clase com.mycompany.Foo , buscará en el directorio de clases un directorio llamado com , luego debajo de ese un directorio llamado mycompany , y finalmente buscará un archivo llamado Foo.class en ese directorio.
En el segundo caso, para archivos jar, buscará en el archivo jar esa clase. Un archivo jar es en realidad sólo una colección comprimida de directorios como el anterior. Si descomprimes un archivo jar, obtendrás un montón de directorios y archivos de clase siguiendo el patrón anterior.
Entonces, la JVM atraviesa un classpath de principio a fin buscando la definición de la clase cuando intenta cargar la definición de clase. Por ejemplo, en el classpath:
C:/miproyecto/clases;C:/miproyecto/lib/stuff.jar;C:/miproyecto/lib/otherstuff.jar
La JVM intentará buscar primero en el directorio clases , luego en cosas.jar y finalmente en otras cosas.jar .
Cuando obtiene una excepción ClassNotFoundException, significa que la JVM ha recorrido todo el classpath y no ha encontrado la clase a la que intentó hacer referencia. La solución, como suele ocurrir en el mundo Java, es comprobar su classpath.
Usted define un classpath en la línea de comando diciendo java -cp y luego su classpath. En un IDE como Eclipse, tendrá una opción de menú para especificar su classpath.
Su classpath está rota (lo cual es un problema muy común en el mundo Java).
Dependiendo de cómo inicie su aplicación, deberá revisar el argumento de -cp
su entrada Class-Path en MANIFEST.MF o el diseño de su disco.
Esta es la mejor solución que encontré hasta ahora.
Supongamos que tenemos un paquete llamado org.mypackage
que contiene las clases:
- HelloWorld (clase principal)
- Clase de soporte
- ClaseUtil
y los archivos que definen este paquete se almacenan físicamente en el directorio D:\myprogram
(en Windows) o /home/user/myprogram
(en Linux).
La estructura del archivo se verá así:
Cuando invocamos Java, especificamos el nombre de la aplicación a ejecutar: org.mypackage.HelloWorld
. Sin embargo también debemos decirle a Java dónde buscar los archivos y directorios que definen nuestro paquete. Entonces, para iniciar el programa, debemos usar el siguiente comando:
NOTA: Debe ejecutar el
java
comando anterior sin importar cuál sea su ubicación actual. Pero este no es el caso dejavac
. Para compilar, puedes incluso ir directamente al directorio donde tienes tus.java
archivos y ejecutarlos directamentejavac ClassName.java
.
Si conoce la ruta de la clase o el archivo jar que contiene la clase, agréguelo a su classpath mientras lo ejecuta. Puede utilizar el classpath como se menciona aquí:
en Windows
java -classpath .;yourjar.jar YourMainClass
en UNIX/Linux
java -classpath .:yourjar.jar YourMainClass