2009-08-14 7 views
70

tengo una clase Java compilado:Cómo ejecutar un .class de Java desde la línea de comandos

Echo.class

public class Echo { 
    public static void main (String arg) { 

      System.out.println(arg); 
    } 
} 

I cd al directorio y escriba: java Echo "hello"

Obtengo este error:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello" 
Exception in thread "main" java.lang.NoClassDefFoundError: Echo 
Caused by: java.lang.ClassNotFoundException: Echo 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
Could not find the main class: Echo. Program will exit. 

¿Cuál es la forma más sencilla de obtener mi código java de forma que pueda ejecutarlo desde la línea de comando como si tuviera que usar Eclipse IDE?

+11

Sugerencia: La pregunta original, tal vez, sería mejor dejarla sin editar para no invalidar las respuestas, bajo una revisión rápida. Es realmente extraño ver la firma correcta del método y luego un montón de respuestas que dicen que fue incorrecta. Se supone que debe dejarse un código erróneo, a los fines de la comparación con la versión correcta, al menos. – JSmyth

Respuesta

83

Probar:

java -cp . Echo "hello" 

Suponiendo que se ha compilado con:

javac Echo.java 

Entonces existe la posibilidad de que el directorio "actual" no está en la ruta de clase (donde java busca definiciones de clase)

Si ese es el caso y enumerando los contenidos de las visualizaciones de su dir:

Echo.java 
Echo.class 

Entonces nada de esto puede trabajar:

java -cp . Echo "hello" 

o

SET CLASSPATH=%CLASSPATH;. 

java Echo "hello" 

y más tarde como Fredrik señala que obtendrá otro mensaje de error similares.

Exception in thread "main" java.lang.NoSuchMethodError: main

Cuando eso sucede, ir a leer su respuesta :)

+0

+1 según lo prometido .. – Fredrik

+0

que parece funcionar pero por qué el: java -cp. – joe

+2

El -cp. decirle a Java que debería agregar. (directorio de trabajo actual) al classpath, es decir, el lugar donde está buscando el código. – Fredrik

11

Es necesario especificar la ruta de clase. Esto debe hacerlo:

java -cp . Echo "hello" 

Esto le dice a java para utilizar . (el directorio actual) como su ruta de clases, es decir, el lugar en el que se ve en las clases. Tenga en cuenta que cuando usa paquetes, el classpath debe contener el directorio raíz, no los subdirectorios del paquete. p.ej. si su clase es my.package.Echo y el archivo .class es bin/my/package/Echo.class, el directorio correcto de classpath es bin.

11

No tiene un método principal válido ... La firma debe ser: public static void main (String [] args);

Por lo tanto, en su caso, el código debería tener este aspecto:

public class Echo { 
    public static void main (String[] arg) { 

      System.out.println(arg[0]); 
    } 
} 

Editar: Tenga en cuenta que Oscar es también justo en que se echa en falta. en tu ruta de clase, te encontrarás con el problema que resuelvo después de que hayas solucionado ese error.

+0

+1 por leer el código – Allyn

+0

@Allyn: Yo hubiera -1 por no haber leído la excepción: :) :) :) Pero estamos entre amigos aquí no nosotros? – OscarRyz

+0

@Oscar: Le di créditos, ¿verdad? :-) (de hecho, también le daré +1 por ello) – Fredrik

0

En primer lugar, ¿ha compilado la clase utilizando el compilador javac de la línea de comandos? En segundo lugar, parece que el método principal tiene una firma incorrecta - se debe tomar en una gran variedad de objetos String, en lugar de sólo uno:

public static void main(String[] args){ 

Una vez que haya cambiado el código para tomar en una serie de cuerdas objetos, entonces usted necesita para asegurarse de que está imprimiendo un elemento de la matriz, en lugar de matriz misma:

System.out.println(args[0]) 

Si desea imprimir toda la lista de argumentos de línea de comandos, que había necesidad de usar un bucle, por ejemplo

for(int i = 0; i < args.length; i++){ 
    System.out.print(args[i]); 
} 
System.out.println(); 
2

Mi situación era un poco complicada. Tenía que hacer tres pasos desde que estaba usando un .dll en el directorio de recursos, para el código JNI. Mis archivos fueron

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll 
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class 

Mi código contenía la siguiente línea

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath()); 

En primer lugar, tenía que pasar al directorio de ruta de clases

cd /D "S:\Accessibility\tools\src\test\java" 

A continuación, he tenido que cambiar la ruta de clase para apuntar al directorio actual para que se cargue mi clase y tuve que cambiar la ruta de clase para apuntar al directorio de recursos para que mi dll se cargue.

set classpath=%classpath%;.;..\..\..\src\main\resources; 

Luego, tuve que ejecutar java usando el nombre de clase.

java com.accessibility.HelloWorld 
Cuestiones relacionadas