2011-02-09 25 views
18

Tengo un problema al intentar ejecutar mi aplicación java. Siempre que intente ejecutar el programa mediante el comandoRecibir "nombre incorrecto" NoClassDefFoundError al ejecutar un programa Java desde la línea de comandos

java ProgAudioJ 

me sale este error:

Exception in thread "main" 
java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ) 
     at java.lang.ClassLoader.defineClass1(NativeMethod) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
     at java.security.AccessController.doPrivileged(NativeMethod) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Could not find the main class: ProgAudioJ. Program will exit. 

Si quito de mi código:

package es_2011; 

Todo funciona perfectamente. ¿Cómo resuelvo el problema?

+0

¿Qué quiere decir 'si eliminar es_2011 '- eliminar de ¿dónde? – akf

+0

Quiero decir desde el código ... – MAX

+3

Creo que tendrá que mostrar el código para ilustrar lo que quiere decir. – DaveJohnston

Respuesta

2

Trate de usar:

java es_2011.ProgAudioJ 

(en lugar de java ProgAudioJ).

Estoy haciendo algunas suposiciones aquí sobre su directorio de trabajo actual y su CLASSPATH. Si puede proporcionar información sobre el comando que está ejecutando (por ejemplo, en qué directorio se encuentra, dónde se encuentra el archivo de clase, etc.), podemos ayudarlo de manera más eficiente.

2

Prueba esto (compilar y ejecutar):

dir

2011-02-10 00:30 <DIR>   . 
2011-02-10 00:30 <DIR>   .. 
2011-02-10 00:27    58 es_2011 

javac es_2011/ProgAudioJ

java es_2011.ProgAudioJ

1

Está bastante claro declaró allí:

java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)

Si usted quiere poner una clase en un paquete (*), entonces el código fuente debe ser colocado en un directorio correspondiente, por ejemplo,

src/Main.java <- root package (no declaration) 
src/es_2011/ProgAudioJ.java <- package es_2011; 

(*) Se debe hágalo siempre, excepto por cosas pequeñas y posiblemente para la clase principal.

+0

OMFG dos votos a favor: D, ¿por qué? ??? – maaartinus

44

Porque encontré estas respuestas poco claras, esto es lo que debe hacer. Primero, si empaqueta su código (es decir, sus clases tienen la palabra clave package en la parte superior), las clases compiladas deben estar en un directorio con el mismo nombre que la declaración del paquete en el código. Después de haber compilado sus clases, necesita mover el directorio al ejecutar el comando java, y usted incluye el nombre del paquete. Por ejemplo, si existe el código en /myFolder/myPackage/, y la clase comienza con package myPackage (tenga en cuenta que el directorio y el paquete son el mismo nombre), a continuación, lleve a cabo lo siguiente (Linux/OSX):

cd /myFolder/myPackage 

javac MyClass.java 

cd .. 

java myPackage.MyClass 

Editar - Una edición tardía para aclarar algo que veo confundir a la gente. En el ejemplo anterior, el paquete solo tiene una profundidad, lo que significa que es solo myPackage.Si el código tiene un paquete más grande, como

package com.somedomain.someproject; 

tendrá que ejecutar el comando java en el directorio que contiene el directorio raíz para ese paquete. Por ejemplo, si su código compilado está en myCode/com/somedomain/someproject/MyMainClass.class, entonces ejecutará el comando java desde la carpeta myCode, así (De nuevo, tenga en cuenta que la estructura del directorio es la misma que el paquete) declaración):

cd /myCode 
java com.somedomain.someproject.MyMainClass 
+3

muchas gracias: DI se estaba volviendo loco para descubrir qué diablos estaba mal, ya que no se mostró ningún error de compilación – Dix

+2

siempre responde por qué en lugar de solo cómo – David

+0

Gracias, y el OP debe seleccionar esta respuesta – user2418202

0

la razón por la que funciona cuando se quita
package es_2011
es que está cambiando la forma en los paquetes del compilador, y localiza de manera efectiva, el archivo.

Tuve el mismo problema, y ​​el mensaje de error wrong name: te indica la respuesta. Está utilizando el nombre incorrecto "ProgAudioJ" para ejecutar el archivo .class. Ha sido empaquetado como

es_2011/ProgAudioJ

Con el fin de ejecutarlo - usted tiene que o bien subir un directorio:

Si usted está aquí: (Windows) src\es_2011\
movimiento para src\

A continuación, ejecute la línea:

java es_2011.ProgAudioJ

Esto le dice al compilador que busque el ProgAudioJ, que se encuentra en el paquete es_2011. Para una instalación estándar, esto se basará en carpetas, por lo que primero buscará la carpeta es_2011 y luego el nombre del archivo .class que desea ejecutar (ProgAudio).

0

Prueba de esto,

  1. Compile su clase mediante el siguiente comando  

    $ javac ProgAudioJ.java -d . 
    
  2. ejecutar su aplicación por orden

    $ java es_2011.ProgAudioJ 
    
Cuestiones relacionadas