Menu

Como executar Java: compilar com javac e executar com java

O ciclo de dois passos compilar-e-executar por trás de todo programa Java: transforme o código-fonte .java em bytecode com javac e depois execute o arquivo .class com java.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Compilar e depois executar

Agora que você tem um JDK instalado, executar Java é um ciclo de dois passos. Diferente de uma linguagem de script, em que você aponta um interpretador para um arquivo e pronto, o Java primeiro compila seu código-fonte legível em bytecode e, em seguida, um passo separado executa esse bytecode na JVM.

Esses dois passos correspondem a duas ferramentas de linha de comando que vêm com o JDK:

  • javac - o compilador. Ele lê Main.java e escreve Main.class (bytecode).
  • java - o lançador. Ele inicia a JVM e executa o bytecode de Main.class.

Você pode executar qualquer exemplo autossuficiente aqui mesmo na página - o editor abaixo faz os dois passos por você. Mas vale a pena entender o que acontece na sua própria máquina, porque é lá que vivem os projetos reais.

Os dois comandos na sua máquina

Digamos que você tem este código salvo como Main.java:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello from the terminal");
    }
}

Abra um terminal na pasta que contém o arquivo e execute o compilador:

javac Main.java

Se o código compilar sem problemas, o javac não imprime nada e cria um novo arquivo, Main.class, ao lado do seu código-fonte. Esse arquivo .class é o bytecode - não é texto legível e não está atrelado ao seu sistema operacional.

Agora execute-o com o comando java:

java Main
Hello from the terminal

O erro mais comum entre iniciantes está aqui: para iniciar o programa você executa java, não javac, e passa o nome da classe sem extensão. É java Main - nunca java Main.class e nunca java Main.java.

O nome do arquivo deve corresponder à classe pública

O Java impõe uma regra que surpreende os iniciantes: uma classe public deve viver em um arquivo com exatamente o mesmo nome, mais .java. Uma public class Main deve estar em Main.java. Erre nas maiúsculas e o javac se recusa a compilar.

// This is in a file called Greeting.java
public class Greeting {   // ERROR: class Greeting should be in Greeting.java... wait, it is
    public static void main(String[] args) {
        System.out.println("Hi");
    }
}

O descompasso que realmente atrapalha as pessoas é mais sutil - nomear o arquivo como greeting.java (minúsculo) enquanto a classe é Greeting, ou salvar Main.java mas escrever public class Hello. O compilador relata algo como:

Main.java:1: error: class Hello is public, should be declared in a file named Hello.java

A correção é sempre a mesma: faça com que o nome do arquivo e o nome da classe pública sejam idênticos, caractere por caractere.

O atalho: executar um único arquivo diretamente

Desde o JDK 11, você pode pular o passo explícito de compilação para um único arquivo-fonte. O comando java o compilará na memória e o executará de uma só vez - nenhum arquivo .class é gravado no disco:

java Main.java

Isso é perfeito para experimentos rápidos e scripts pequenos. Note a diferença no que você passa:

  • java Main - executa um Main.class já compilado.
  • java Main.java - compila e executa o arquivo-fonte de uma só vez.

O modo de arquivo único só funciona quando todo o seu programa cabe em um arquivo. No momento em que você divide o código em várias classes em vários arquivos, você volta a compilar primeiro com o javac. Para aprender o básico, o modo de arquivo único mantém o ciclo curto.

Passando argumentos para o seu programa

Lembra do String[] args no main? Esses são os argumentos de linha de comando. Tudo o que você digitar depois do nome da classe no comando java cai naquele array:

Na sua própria máquina, você passaria argumentos assim:

java Main hello world
First argument: hello
Total arguments: 2

O editor acima não consegue receber argumentos de terminal, então ele executa o ramo "sem argumentos" - mas o mesmo código trata os dois casos. É assim que os programas Java leem a entrada passada no momento da inicialização, muito antes de você chegar a arquivos ou à entrada do usuário.

Lendo as mensagens de erro do compilador

Quando o javac rejeita seu código, ele informa o arquivo, a linha e o que deu errado. Aprender a ler essas mensagens é metade do caminho para se desenrolar. Aqui está um clássico - um ponto e vírgula faltando:

public class Main {
    public static void main(String[] args) {
        System.out.println("Oops")   // no semicolon
    }
}
Main.java:3: error: ';' expected
        System.out.println("Oops")
                                  ^
1 error

O acento circunflexo (^) aponta para onde o compilador esperava algo. Main.java:3 é o arquivo e o número da linha. Resista à vontade de adivinhar - leia a linha, corrija a única coisa que ela aponta e recompile. Erros de compilação significam que nada foi executado ainda; erros de tempo de execução (que têm outra aparência) significam que seu programa iniciou e depois falhou.

Um programa de verificação

Execute isto no editor ou salve-o como Main.java e faça javac Main.java e depois java Main na sua própria máquina. Se você vir as três linhas, sua cadeia de ferramentas funciona de ponta a ponta:

Aparecem aqui três coisas que você conhecerá direito em breve: uma variável int, a concatenação de strings com + e um array com seu .length. Por enquanto, basta que o programa compile e imprima.

Próximo: Sintaxe do Java

Você executou alguns programas, mas estávamos passando por cima da pontuação - as chaves, os pontos e vírgulas, public static void main e por que cada linha tem a aparência que tem. A próxima página desmonta a sintaxe do Java peça por peça, para que a estrutura deixe de parecer código repetitivo e comece a fazer sentido.

Perguntas frequentes

Como eu executo um programa Java?

Salve seu código em um arquivo com o mesmo nome da classe pública (por exemplo, Main.java), abra um terminal nessa pasta e execute dois comandos: javac Main.java para compilá-lo em bytecode e depois java Main para executá-lo. Com o JDK 11 ou mais recente, você pode pular o primeiro passo para um único arquivo e simplesmente executar java Main.java diretamente.

Qual é a diferença entre javac e java?

javac é o compilador: ele lê seu código-fonte .java e produz um arquivo .class cheio de bytecode. java é o lançador: ele inicia a JVM e executa o bytecode de um arquivo .class. Você compila uma vez com javac e depois executa quantas vezes quiser com java.

Por que aparece "could not find or load main class"?

Quase sempre porque você passou o nome errado para o java. Use o nome da classe, não o do arquivo: é java Main, não java Main.class nem java Main.java. Além disso, verifique se você está na pasta que contém o Main.class e se o nome da classe corresponde exatamente ao nome do arquivo, incluindo as letras maiúsculas.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR