Como executar um java .class da linha de comando

113

Eu tenho uma classe java compilada:

Echo.class

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

            System.out.println(arg);
    }
}

I cdpara o diretório e digite:java Echo "hello"

Eu recebo este erro:

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.

Qual é a maneira mais simples de obter meu código java em um formato que eu possa executar na linha de comando em vez de ter que usar o IDE Eclipse?

joe
fonte
14
Sugestão: Talvez seja melhor deixar a pergunta original sem edição para não invalidar as respostas, sob uma revisão rápida. É muito estranho ver a assinatura do método certa e depois um monte de respostas que dizem que ela estava incorreta. Supõe-se que o código errado seja deixado, para fins de comparação com a versão correta, pelo menos.
JSmyth

Respostas:

119

Experimentar:

java -cp . Echo "hello"

Supondo que você compilou com:

javac Echo.java 

Então, há uma chance de que o diretório "atual" não esteja em seu classpath (onde java procura por definições .class)

Se for esse o caso e listar o conteúdo do seu dir será exibido:

Echo.java
Echo.class

Então, tudo isso pode funcionar:

java -cp . Echo "hello"

ou

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

E mais tarde, como Fredrik aponta, você receberá outra mensagem de erro como.

Exceção no thread "main" java.lang.NoSuchMethodError: main

Quando isso acontecer, vá e leia a resposta dele :)

OscarRyz
fonte
2
O -cp. para dizer ao Java que ele deve adicionar. (diretório de trabalho atual) para o classpath, ou seja, o lugar onde ele está procurando o código.
Fredrik
16

Você precisa especificar o caminho de classe. Isso deve servir:

java -cp . Echo "hello"

Isso diz ao java para usar .(o diretório atual) como seu caminho de classe, ou seja, o lugar onde procura por classes. Observe que, ao usar pacotes, o caminho de classe deve conter o diretório raiz, não os subdiretórios do pacote. por exemplo, se sua classe é my.package.Echoe o arquivo .class é bin/my/package/Echo.class, o diretório de caminho de classe correto é bin.

Michael Borgwardt
fonte
15

Você não tem nenhum método principal válido ... A assinatura deve ser: public static void main ( String [] args);

Portanto, no seu caso, o código deve ser assim:

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

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

Edit: Observe que Oscar também está certo em que você está faltando. em seu classpath, você encontraria o problema que resolvi depois de lidar com esse erro.

Fredrik
fonte
15

Com o Java 11, você não terá mais que passar por essa bobagem!

Em vez disso, você pode fazer isso:

> java MyApp.java

Você não precisa compilar de antemão, pois tudo é feito em uma única etapa.

Você pode obter o Java 11 JDK aqui: JDK 11 GA Release

Ryan Lundy
fonte
> copiar C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Alguns caras preferem o jeito antigo =)
Jr.
3

Se você tem em sua fonte java

package mypackage;

e sua classe é hello.java com

public class hello {

e nesse hello.java você tem

 public static void main(String[] args) {

Então (após a compilação) mudeDir (cd) para o diretório onde está o seu hello.class. Então

java -cp . mypackage.hello

Observe o diretório atual e o nome do pacote antes do nome da classe. Funciona no Linux Mint e espero que nos outros sistemas operacionais também

Obrigado Stack overflow por uma riqueza de informações.

Gerard Doets
fonte
1
NB: o arquivo de classe deve ser encontrado através do ./mypackage/hello.classnome. Veja também: pergunta " Executando java no pacote da linha de comando ".
ruvim
2

Minha situação era um pouco complicada. Tive que fazer três etapas, já que estava usando um .dll no diretório de recursos, para o código JNI. Meus arquivos eram

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

Meu código continha a seguinte linha

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

Primeiro, eu tive que mover para o diretório do classpath

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

Em seguida, tive que alterar o caminho de classe para apontar para o diretório atual para que minha classe fosse carregada e eu tive que alterar o caminho de classe para apontar para o diretório de recursos para que minha dll fosse carregada.

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

Então, eu tive que executar o java usando o nome da classe.

java com.accessibility.HelloWorld 
Scott Izu
fonte
0

Primeiro, você compilou a classe usando o compilador javac da linha de comando? Em segundo lugar, parece que seu método principal tem uma assinatura incorreta - ele deve receber uma matriz de objetos String, em vez de apenas um:

public static void main(String[] args){

Depois de alterar seu código para incluir uma matriz de objetos String, você precisa ter certeza de que está imprimindo um elemento da matriz, em vez da própria matriz:

System.out.println(args[0])

Se você quiser imprimir toda a lista de argumentos de linha de comando, você precisará usar um loop, por exemplo

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