¿Cómo resuelvo ClassNotFoundException?

Resuelto user2426316 asked hace 11 años • 30 respuestas

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?

user2426316 avatar Jul 01 '13 22:07 user2426316
Aceptado

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.

user2000590 avatar Jul 01 '2013 16:07 user2000590

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 -cpsu entrada Class-Path en MANIFEST.MF o el diseño de su disco.

Thorbjørn Ravn Andersen avatar Jul 01 '2013 16:07 Thorbjørn Ravn Andersen

Esta es la mejor solución que encontré hasta ahora.

Supongamos que tenemos un paquete llamado org.mypackageque 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í: ingrese la descripción de la imagen aquí

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: ingrese la descripción de la imagen aquí

NOTA: Debe ejecutar el javacomando anterior sin importar cuál sea su ubicación actual. Pero este no es el caso de javac. Para compilar, puedes incluso ir directamente al directorio donde tienes tus .javaarchivos y ejecutarlos directamente javac ClassName.java.

Ram Patra avatar Oct 05 '2015 06:10 Ram Patra

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
Juned Ahsan avatar Jul 01 '2013 16:07 Juned Ahsan