Cómo ejecutar un Java .class desde la línea de comandos

113

Tengo una clase java compilada:

Clase de eco

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

            System.out.println(arg);
    }
}

Yo cdal directorio y entro:java Echo "hello"

Me sale 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 en una forma que pueda ejecutar desde la línea de comandos en oposición a tener que usar Eclipse IDE?

Joe
fuente
14
Sugerencia: Quizá sea mejor dejar la pregunta original sin editar para no invalidar las respuestas, bajo una revisión rápida. Realmente extraño ver la firma del método correcto y luego un montón de respuestas que dicen que era incorrecto. Se supone que se debe dejar un código erróneo, al menos con el fin de compararlo con la versión correcta.
JSmyth

Respuestas:

119

Tratar:

java -cp . Echo "hello"

Suponiendo que compiló con:

javac Echo.java 

Entonces existe la posibilidad de que el directorio "actual" no esté en su classpath (donde Java busca definiciones .class)

Si ese es el caso y se muestra una lista del contenido de su directorio:

Echo.java
Echo.class

Entonces cualquiera de esto puede funcionar:

java -cp . Echo "hello"

o

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Y más tarde, como señala Fredrik , obtendrá otro mensaje de error como.

Excepción en el hilo "main" java.lang.NoSuchMethodError: main

Cuando eso suceda, ve y lee su respuesta :)

OscarRyz
fuente
2
El -cp. para decirle a Java que debería agregar. (directorio de trabajo actual) a la ruta de clase, es decir, el lugar donde está buscando el código.
Fredrik
16

Debe especificar la ruta de clase. Esto debería hacerlo:

java -cp . Echo "hello"

Esto le dice a Java que use .(el directorio actual) como su ruta de clases, es decir, el lugar donde busca las clases. Tenga en cuenta que cuando utiliza paquetes, la ruta de clases debe contener el directorio raíz, no los subdirectorios del paquete. por ejemplo, si su clase es my.package.Echoy el archivo .class es bin/my/package/Echo.class, el directorio de ruta de clases correcto es bin.

Michael Borgwardt
fuente
15

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 verse así:

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

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

Editar: tenga en cuenta que Oscar también tiene razón en que no está. en su classpath, se encontrará con el problema que resuelvo después de haber tratado con ese error.

Fredrik
fuente
15

¡Con Java 11 ya no tendrás que pasar por este galimatías!

En su lugar, puede hacer esto:

> java MyApp.java

No tiene que compilar de antemano, ya que todo se hace en un solo paso.

Puede obtener Java 11 JDK aquí: JDK 11 GA Release

Ryan Lundy
fuente
> copiar C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Algunos chicos prefieren el estilo antiguo =)
Jr.
3

Si tiene en su fuente java

package mypackage;

y tu clase es hello.java con

public class hello {

y en eso hola java tienes

 public static void main(String[] args) {

Luego (después de la compilación) cambieDir (cd) al directorio donde está su hello.class. Luego

java -cp . mypackage.hello

Tenga en cuenta el directorio actual y el nombre del paquete antes del nombre de la clase. Funciona para mi en linux mint y espero que en otros sistemas operativos también

Gracias Stack overflow por una gran cantidad de información.

Gerard Doets
fuente
1
NB: el archivo de clase debe poder ser encontrado mediante el ./mypackage/hello.classnombre. Consulte también: Pregunta " Ejecutar java en el paquete desde la línea de comandos ".
ruvim
2

Mi situación fue un poco complicada. Tuve que hacer tres pasos ya 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());

Primero, tuve que moverme al directorio classpath

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

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

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

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

java com.accessibility.HelloWorld 
Scott Izu
fuente
0

Primero, ¿ha compilado la clase usando el compilador javac de línea de comando? En segundo lugar, parece que su método principal tiene una firma incorrecta; debería incluir una matriz de objetos String, en lugar de solo uno:

public static void main(String[] args){

Una vez que haya cambiado su código para incluir una matriz de objetos String, debe asegurarse de que está imprimiendo un elemento de la matriz, en lugar de la matriz en sí:

System.out.println(args[0])

Si desea imprimir la lista completa de argumentos de la línea de comando, deberá usar un bucle, por ejemplo

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