2011-03-21 15 views
5

que tiene un programa Java llamada Main.java, que se encuentra en el siguiente directorio:NoClassDefFoundError en Java

/home/user/program/Main.java 

Cuando trato de ejecutar Main.java desde el directorio 'programa', todo va bien , yo uso esta línea:

/home/user/program$ java Main 

Pero cuando trato de ejecutar Main.java desde el directorio de inicio:

/home$ java /home/user/program/Main 

obtengo:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main 
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main 

¿Cuál es la causa de este error?

+0

puede publicar el código de su clase principal – GuruKulki

+0

@svrist OP dice que funciona. @shaw intente establecer la ruta de clases 'java -cp/home/user/program Main' – Nishant

Respuesta

10

Esto se debe a la ruta de clases, que por defecto en el directorio actual. Cuando ejecuta java Main desde /home/user/program encuentra la clase en el directorio actual (ya que el paquete parece estar desarmado, lo que significa que es el predeterminado). Por lo tanto, encuentra la clase en /home/user/program/Main.class.

Ejecución de java /home/user/program/Main/home trata de encontrar la clase en la ruta de clase (el directorio actual) que se verá en /home/home/user/program esperando encontrar el archivo Main.class que contiene una definición de la clase Main con el paquete .home.user.program.

detalle adicional: Creo que el lanzador java está tratando de ser agradable por la conversión de /-notation de un nombre de clase a la notación.; y cuando ejecuta java /home/user/program/Main es realmente ejecutándose java .home.user.program.Main para usted. Este se debe a que no debe especificar un archivo, sino un nombre de clase completamente especificado (es decir, que incluye el especificador del paquete ).Y cuando una clase tiene un paquete java espera encontrar esa clase dentro de una estructura de directorio que coincida con el nombre del paquete , dentro de un directorio (o jar) en el classpath ; por lo tanto, intentará buscar en /home/home/user/program para el archivo de clase

se puede arreglar mediante la especificación de la ruta de clases con -cp o -classpath:

java -cp /home/user/program Main 
+0

gracias funcionó! – shaw

+0

Si tiene un paquete definido, puede necesitar hacer esto: 'java -cp/home/user/program :. Main' The extra ': .' means" y el directorio actual. –

3

Porque está buscando la clase usando el nombre completo que le das (/ home/user/program/Main). Sólo se debe buscar la Clase principal pero utilizando la buena ruta de clases: java principal cp/home/usuario/programa

Lo que significa que va a buscar en la clase principal en el conjunto dado de caminos

+0

+1 para realmente responder. – Nishant

0

Su segundo la versión del comando no sabe dónde encontrar las clases. Es necesario proporcionar la denominada ruta de clase

/home$ java -cp userprogram Main 
+0

'-cp usuario/programa' Supongo :) – helios

+0

Derecha - Vi/home/usuario como el directorio de inicio –

0

Debido a lo que dice llego a la conclusión siguiente:

  • principal es en el paquete de "arriba" (raíz)

Y cuando ejecuta java, debe indicar el classpath, es decir, el directorio raíz donde está ubicada su pakage y la estructura de clases.

En su caso, es el programa/home/user /. Y supongo que su classpath se define como "." (el directorio en el que se encuentra) Cuando llama a Java desde su casa, el classpath se toma erróneamente.

Si quiere llamar a su principal usando un paquete diferente declarar el paquete en la parte superior de la clase:

package user.program; 

y establecer la ruta de clases a/home (o ejecutar Java desde ese directorio). Próxima llamada java de esta manera:

java user.program.Main 

usando puntos porque es un nombre de clase completo (lo que indica paquetes). Eso se traduce en dirs concatenando classpath + paquete + clase. Por ejemplo:

/home 
user.program -> user/program/ 
Main   -> Main.class 

¡Buena suerte!

+0

gracias por la información, esto me hizo entender más lo que significa un classpath – shaw

+0

¡Genial! Me alegro. – helios

0

El problema es que si se llama el paquete java /home/user/program/MainMain está en está destinado a ser home.user.program, que supongo que no es cierto para Main (supongo que está en el paquete por defecto, es decir, ninguno en absoluto). ¿Hay una declaración package en la parte superior de Main?

Sugiero usar las sugerencias de ruta de clases en las otras respuestas.

0

Esto funciona para mí:

java-cp/home/usuario/programa principal

0

hace un rato enfrentan este tipo de error de (NoClassDefFoundError). Importé una biblioteca de terceros en mi aplicación de Android usando eclipse env. Obtuve este error durante el tiempo de ejecución: no se pudo encontrar alguna clase de esta biblioteca de terceros y se produjo un resultado de este NoClassDefFoundError, a pesar de que la biblioteca mencionada apareció correctamente en classpath, así que realmente no sabía qué más se podía hacer para resolver este problema. Mientras jugaba con "Orden y exportación" pestaña dentro "Java Build Path", puse mi biblioteca de terceros importados a la parte superior de la lista de todas las bibliotecas de mi proyecto y comprueba su casilla de verificación - esto resolvió el problema

0

Encontré este mismo error al intentar compilarlo y ejecutarlo. El libro, "Head First Java" explica y aborda este problema de manera adecuada. Aquí hay una captura de pantalla del libro para su referencia.

A screenshot from Head First Java about how to compile and run a java program by including package names.

Espero su ayuda.

Cuestiones relacionadas