Como Compilar e Executar um Programa Java
Use javac para compilar arquivos .java em bytecode .class e o launcher java para executá-los na JVM.
Um programa Java passa por duas etapas antes de produzir saída. Primeiro, o compilador transforma seus arquivos-fonte .java em bytecode neutro de plataforma (arquivos .class). Em seguida, a JVM carrega esse bytecode e o executa. Entender as duas etapas é o que permite raciocinar sobre erros de classpath, empacotamento e os casos extremos que ocasionalmente aparecem.
Este capítulo percorre a cadeia de ferramentas — javac, java e jshell — e o layout de arquivos que as ferramentas esperam.
A cadeia de ferramentas
Ao instalar o JDK você obtém três comandos que usará constantemente:
javac— o compilador Java. Recebe arquivos-fonte.javae produz arquivos.class.java— o launcher. Carrega a JVM, encontra uma classe pelo nome e executa seu métodomain.jshell— um REPL interativo (read-eval-print loop) para experimentar trechos de código sem escrever um programa completo. Adicionado no Java 9.
Você pode confirmar que estão disponíveis executando cada um com -version:
javac -version
java -version
jshell --versionCompilar um único arquivo-fonte
Suponha que você tenha este arquivo salvo como Greeting.java:
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello from javac!");
}
}Compile-o:
javac Greeting.javaSe não houver erros, você verá um novo arquivo no mesmo diretório chamado Greeting.class. Esse é o bytecode. Execute-o:
java GreetingHello from javac!Observe que você passa o nome da classe, não o nome do arquivo. java Greeting.class está errado; assim como java Greeting.java.
Compilar um programa com pacotes
Programas reais são organizados em pacotes que espelham seu layout de diretórios. Uma classe declarada como package com.example.greet; deve estar em com/example/greet/.
project/
└── src/
└── com/example/greet/
└── Greeting.java// src/com/example/greet/Greeting.java
package com.example.greet;
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello with packages!");
}
}A partir do diretório project/, compile e execute com o nome de classe totalmente qualificado:
javac -d out src/com/example/greet/Greeting.java
java -cp out com.example.greet.Greeting-d outdiz aojavacpara colocar os arquivos.classgerados no diretórioout/(recriando a estrutura de diretórios do pacote).-cp outdiz aojavapara procurar classes no classpathout/.com.example.greet.Greetingé o nome de classe totalmente qualificado — o pacote, um ponto e a classe.
Na prática, você usaria uma ferramenta de build (Maven ou Gradle, abordados mais adiante neste livro) para fazer tudo isso. Mas saber o que elas fazem internamente ajuda quando algo falha.
Modo de arquivo-fonte (programas de arquivo único)
Desde o Java 11 você pode pular o javac completamente para programas de um único arquivo:
java Greeting.javaO launcher compila em memória e executa o resultado imediatamente — nenhum arquivo .class é gravado em disco. É ideal para scripts rápidos e exercícios de livros.
O modo de arquivo-fonte só funciona quando o programa cabe em um único arquivo .java. No momento em que você dividir seu código em dois arquivos-fonte, volte ao javac (ou a uma ferramenta de build) para compilá-los juntos.
jshell — o REPL interativo
O jshell permite digitar expressões e instruções Java uma linha de cada vez, assim como um REPL Python ou Node:
$ jshell
| Welcome to JShell -- Version 21.0.4
| For an introduction type: /help intro
jshell> int x = 21
x ==> 21
jshell> int y = 21
y ==> 21
jshell> x + y
$3 ==> 42
jshell> System.out.println("Hello!")
Hello!
jshell> /exitVocê não precisa de uma classe, de um método main ou sequer de ponto e vírgula para expressões simples. É uma excelente forma de explorar a biblioteca padrão sem configurar um projeto.
Executar a partir da IDE
Toda IDE Java — IntelliJ, Eclipse, VS Code — invoca javac e java nos bastidores quando você clica em Run. A IDE também gerencia o classpath, exibe erros do compilador inline e mostra a saída do programa em um painel de console. Você não precisa usar a linha de comando, mas saber o que a IDE está fazendo torna a depuração de problemas de build muito mais rápida.
Um exemplo ao vivo
O bloco executável abaixo passa pelo mesmo ciclo javac → java em nosso servidor toda vez que você pressiona Run:
Edite o código, pressione Run e o servidor compila seu código-fonte modificado e imprime o que o programa produzir.
Erros comuns de compilação
Alguns erros que você encontrará frequentemente:
class Greeting is public, should be declared in a file named Greeting.java— o nome do arquivo e o nome da classe pública devem corresponder exatamente.error: cannot find symbol— geralmente um erro de digitação, umimportausente ou uma classe que não está no classpath.';' expected— um ponto e vírgula ausente no final de uma instrução.error: package x.y.z does not exist— o diretório do pacote não está no classpath, ou ojavacfoi apontado para a raiz de origem errada.
Em caso de dúvida, leia a mensagem de erro — os diagnósticos do javac são excepcionalmente claros.
O que vem a seguir
Com as ferramentas ao seu alcance, a próxima parte do livro começa na linguagem em si: Java Variables, Data Types e o restante dos fundamentos de sintaxe.