W3docs

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 .java e produz arquivos .class.
  • java — o launcher. Carrega a JVM, encontra uma classe pelo nome e executa seu método main.
  • 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 --version

Compilar 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.java

Se não houver erros, você verá um novo arquivo no mesmo diretório chamado Greeting.class. Esse é o bytecode. Execute-o:

java Greeting
Hello 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 out diz ao javac para colocar os arquivos .class gerados no diretório out/ (recriando a estrutura de diretórios do pacote).
  • -cp out diz ao java para procurar classes no classpath out/.
  • 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.java

O 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.

Nota

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> /exit

Você 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 javacjava em nosso servidor toda vez que você pressiona Run:

java— editable, runs on the server

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, um import ausente 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 o javac foi 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.

Prática

Prática
Qual comando compila Greeting.java em bytecode?
Qual comando compila Greeting.java em bytecode?
Was this page helpful?