A maioria dos sites na internet digamos:
"usar o
javac
comando para compilar um.java
arquivo. Em seguida, executá-lo usando ojava
comando"
Mas hoje eu tentei executar um programa java sem javac
e eu tenho um resultado estranho.
Eis o conteúdo de um arquivo chamado hello.java
:
public class Myclass {
public static void main(String[] args){
System.out.println("hello world");
}
}
Então eu corri:
$ javac hello.java
O que me dá esse erro:
hello.java:1: error: class Myclass is public, should be declared in a file named Myclass.java
public class Myclass {
^
1 error
Mas quando eu executá-lo sem o javac
comando, ele executou sem erros.
$ java hello.java
hello world
O java
comando também compilar o programa? Se sim, por que precisamos do javac
comando?
A versão do meu java é:
openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode)
Antes de Java 11, para executar seu código você tem que primeiro compilá-lo, então você pode executá-lo. Aqui está um exemplo:
javac test.java
java test
Desde Java 11, você ainda pode fazer javac
+ java
, ou você pode executar java
por si só para compilar e auto-executar o seu código. Note que nenhum .class
arquivo será gerado. Aqui está um exemplo:
java test.java
Se você executar java -help
, você verá os vários usos permitidos. Aqui está o que parece que na minha máquina. O último é o que você correu para dentro: java [options] <sourcefile> [args]
o que irá "executar um único programa de arquivo de origem".
$ java -help
Usage: java [options] <mainclass> [args...]
(to execute a class)
or java [options] -jar <jarfile> [args...]
(to execute a jar file)
or java [options] -m <module>[/<mainclass>] [args...]
java [options] --module <module>[/<mainclass>] [args...]
(to execute the main class in a module)
or java [options] <sourcefile> [args]
(to execute a single source-file program)
ATUALIZAR:
Como apontado por @BillK, OP também perguntou:
por que precisamos o comando javac?
A razão que precisamos javac
é criar .class
arquivos para que o código pode ser criado, testado, distribuído, executado, partilhado, etc. como é hoje. A motivação para a PEC 330 foi para torná-lo mais fácil para os "estágios iniciais de aprender Java, e ao escrever pequenos programas utilitários" sem alterar quaisquer outros usos existentes.