2012-05-08 28 views
8

Tengo dos problemas con respecto a la compilación y ejecución de un proyecto de Eclipse java desde la línea de comandos. Esto funciona bien cuando estoy corriendo desde el eclipse IDE. Intenté buscar en Google pero no conseguí que funcionara. Cualquier ayuda es muy apreciada.Ejecutar proyecto de Eclipse desde la línea de comandos

Problema 1: Cuando intento compilar desde una ubicación diferente al directorio donde está el archivo .java, arroja el error "no se puede leer: myfile.java". Pero si migro a este directorio, entonces compila.
El comando que le estaba dando es (cuando en algún otro directorio):
javac -cp C: \ ABC \ src \ XYZ myfile.java
El comando que le estaba dando, cuando en el directorio XYZ:
javac myfile.java
esto genera dos archivos .class y myfile.class Testing_Thread.class (supongo que esto porque tengo un hilo en mi código)

Problema 2: Después de haber compilado por ir a su directorio , cuando intento ejecutar el programa, aparece el error "Excepción en el hilo" main "java.lang.NoClassDefFoundError: myfile (nombre incorrecto: XYZ/myfile.java)" incluso cuando intento ejecutar desde el directorio XYZ. Obtengo el mismo error cuando trato de ejecutar desde otro lugar también.
El comando que le estaba dando, cuando en XYZ directorio:
mi_archivo java
El comando que le estaba dando, cuando en algún otro lugar:
java -cp C: \ ABC \ src \ XYZ mi_archivo

también estoy adjuntando una jerarquía de mi estructura de directorios si es de ninguna ayuda:
enter image description here

Respuesta

8

Estos ejemplos asumen la siguiente estructura fuente:

C:\temp\compile-test\src\a\b\c\D.java 

Dónde D.java es:

package a.b.c; 

public class D { } 

El primer problema, no puede leer: myfile.java, es porque no es correcto utilizar la opción de línea de comandos cp señalar a tu código fuente

C:\temp\compile-test\src>javac -cp c:\temp\compile-test\src\a\b\c D.java 
javac: file not found: D.java 
Usage: javac <options> <source files> 
use -help for a list of possible options 

Esto debería ser en su lugar lo siguiente, donde javac se ejecuta desde la carpeta de origen, y podemos utilizar rutas relativas a los archivos de origen (NOTA - javac se ejecuta desde la carpeta de origen aquí):

C:\temp\compile-test\src>javac a\b\c\D.java 

O éste, en el que especifica las rutas completas a los archivos de origen y javac se puede ejecutar desde cualquier lugar (NOTA - javac se ejecuta desde C:\ aquí):

C:\>javac temp\compile-test\src\a\b\c\D.java 

Tanto de las opciones anteriores dará lugar a los archivos de clases que se crean en la misma carpeta como la fuente. Es decir.:

C:\temp\compile-test\src\a\b\c\D.class 

Para el segundo problema, si tratas de ejecutar una clase que tiene un nombre de paquete desde 'dentro' del paquete, esto dará como resultado el nombre de equivocarse (NOTA - java se ejecuta desde 'dentro' el paquete aquí):

C:\temp\compile-test\src\a\b\c>java D 
Exception in thread "main" java.lang.NoClassDefFoundError: D (wrong name: a/b/c/D) 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
     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(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
Could not find the main class: D. Program will exit. 

Para ejecutar la clase D, que debe estar en el paquete 'root', y suministrar el Fully Qualified Class Name. Es decir .:

C:\temp\compile-test\src>java a.b.c.D 
Exception in thread "main" java.lang.NoSuchMethodError: main 

Nota Puedo obtener una excepción, ya que la clase D no tiene un método principal, y por lo tanto no se puede ejecutar. Para solucionar, añadimos un método principal:

package a.b.c; 

public class D { 
    public static void main(String[] args) { 
     System.out.println("main"); 
    } 
} 

y volver a ejecutar:

C:\temp\compile-test\src>java a.b.c.D 
main 
+0

Gracias por la explicación maravillosamente claro :) – sachin11

Cuestiones relacionadas