JRE e JDK: diferenças, papel da JVM e qual pacote Java instalar

Um JRE (Java Runtime Environment) executa programas Java compilados. Um JDK (Java Development Kit) fornece capacidades de tempo de execução, além de um compilador e ferramentas de desenvolvimento, então escolha um JDK ao aprender Java ou construir código-fonte. Para executar um aplicativo já existente, siga seus requisitos de tempo de execução; um aplicativo que inclui seu próprio runtime pode não precisar de uma instalação separada do Java.

O que é um JRE?

Um JRE é o ambiente necessário para executar programas Java compilados. Ele combina uma JVM (Máquina Virtual Java), bibliotecas de classes padrão e arquivos de suporte em tempo de execução. Bytecode é o formato de instrução usado pela JVM, geralmente armazenado em arquivos .class produzidos a partir do código-fonte Java.

Um pacote típico de JRE apenas para execução não fornece o compilador de código-fonte javac. Ser capaz de executar java, portanto, não prova que as ferramentas de desenvolvimento estão instaladas. Além disso, é importante distinguir o conceito de ambiente de execução dos nomes dos pacotes disponíveis em um determinado site de download.

O que é um JDK?

Um JDK fornece ferramentas para desenvolver e executar programas Java. Use javac para compilar arquivos-fonte e java para executar programas. Um JDK de desenvolvimento já fornece capacidades de execução, então você não precisa de uma segunda instalação do JRE apenas para executar programas com esse JDK.

  • javac compila arquivos-fonte .java em arquivos .class.
  • java inicia a JVM e lança um programa Java.
  • jar empacota classes e recursos em um arquivo JAR (Java Archive).
  • javadoc gera documentação de API (Application Programming Interface) a partir de declarações e comentários de documentação.
  • jdb suporta depuração, incluindo a interrupção da execução e a inspeção de variáveis.

Isso não significa que um JDK inclua todos os editores ou IDEs (Ambiente de Desenvolvimento Integrado). Você pode escolher um editor separadamente, e um IDE pode exigir que você selecione um JDK de projeto para compilar o código. O papel do compilador é descrito em Referência javac da Oracle.

Como a JVM, o JRE e o JDK se relacionam?

A JVM é o componente que executa o bytecode. Um JRE adiciona bibliotecas e arquivos de suporte para formar um ambiente de execução; um JDK adiciona ferramentas de desenvolvimento enquanto também fornece capacidades de execução. Esses termos descrevem diferentes papéis e escopos.

Por exemplo, javac transforma HelloWorld.java em HelloWorld.class, e java HelloWorld inicia o programa em uma JVM. Um arquivo de classe pode ser executado em outro sistema operacional com um tempo de execução compatível, mas aplicativos que usam bibliotecas nativas ou versões específicas do Java têm requisitos adicionais. Veja a introdução à especificação da Máquina Virtual Java para entender a relação entre a JVM e os arquivos de classe.

Comparação JRE vs JDK

Critério JRE apenas para execução JDK
Objetivo principal Executar aplicativos compilados Desenvolver, compilar e executar aplicativos
JVM e bibliotecas de tempo de execução Incluído Incluído
Launcher do Java Normalmente disponível Disponível
Compilador javac Normalmente ausente Disponível
Quando escolhê-lo Uma aplicação requer um runtime externo compatível Aprender Java, construir código-fonte ou trabalho de desenvolvimento
Disponibilidade para download Depende do fornecedor, versão e sistema operacional Escolha um fornecedor e plataforma suportada

Esta tabela compara os papéis usuais de um pacote apenas de tempo de execução e de um kit de desenvolvimento. Um runtime personalizado pode conter uma seleção diferente de módulos, portanto, apenas o nome não garante que todas as bibliotecas ou ferramentas estejam presentes.

Um JDK moderno contém uma pasta JRE?

“O JDK inclui o JRE” é uma abreviação útil para capacidades de runtime, mas não é uma descrição precisa de cada layout de diretório atual. O JDK 8 e versões anteriores utilizavam um diretório interno jre/; o JDK 9 introduziu imagens de runtime modulares. A Oracle deixou de oferecer downloads separados do JRE e do Server JRE com o JDK 11. O guia de migração do Oracle JDK 11 explica essas mudanças de empacotamento e layout.

Isso não significa que todo fornecedor deixou de distribuir pacotes apenas de tempo de execução. A página de download do Eclipse Temurin distingue pacotes JDK e JRE; verifique o que está realmente disponível para a versão e o sistema operacional que você precisa. Uma mudança de empacotamento feita por um fornecedor não é uma regra universal do Java.

Os desenvolvedores também podem usar a ferramenta jlink do JDK para reunir os módulos necessários e suas dependências em uma imagem de execução personalizada. Distribuir esse ambiente com o aplicativo pode reduzir a necessidade de instalar um JRE do sistema separadamente. A seleção dos módulos e suas atualizações continuam sob responsabilidade do distribuidor, como explica a referência do jlink.

Qual pacote e versão você deve escolher?

  • Aprendizado e desenvolvimento: escolha a versão do JDK exigida pelo seu curso ou projeto, incluindo as versões compatíveis com ferramentas de build e bibliotecas.
  • Execução de um aplicativo existente: verifique suas instruções de instalação para a versão do Java necessária e se ela precisa de um runtime externo. Alterar o Java do sistema pode não ter efeito em um aplicativo com um runtime incluído.
  • Implantação em servidor: escolha uma configuração compatível com os módulos necessários, ao sistema operacional e à arquitetura da CPU. Um servidor que também compila código-fonte ou precisa de ferramentas do JDK pode exigir um JDK.

Um número de versão maior sozinho não garante compatibilidade. Por exemplo, um runtime Java 17 não consegue necessariamente ler uma classe compilada para Java 21. Executar uma aplicação mais antiga em uma versão mais nova do Java também requer verificar recursos removidos e a compatibilidade de bibliotecas.

Para o seu próprio código-fonte, considere javac --release ao direcionar uma versão anterior do Java suportada. Isso restringe recursos da linguagem, APIs de plataforma e a saída de arquivos de classe, mas não torna automaticamente compatíveis as dependências externas. Teste o resultado no runtime de destino real.

Instale um JDK e verifique os executáveis selecionados

Em uma página oficial de download, selecione o tipo de pacote, a versão do Java, o sistema operacional e a arquitetura da CPU, como x64 ou ARM64. Se o distribuidor fornecer checksums, você pode verificar o arquivo baixado usando seu hash antes da instalação.

Instalação e verificações no Windows

Com um instalador MSI do Eclipse Temurin, use o Custom Setup para selecionar o diretório de instalação e os recursos. Adicionar o Java ao PATH ajuda no uso via linha de comando; selecione o recurso JAVA_HOME se suas ferramentas de build precisarem dele. Veja o Guia de instalação do Temurin no Windows para essas opções. Após a instalação, feche os terminais existentes e abra um novo.

java -version
javac -version

Verifique se ambos os comandos funcionam e informam a versão principal do Java pretendida. Se apenas java -version funcionar, o tempo de execução foi encontrado, mas o compilador pode não estar disponível. No PowerShell, inspecione os caminhos selecionados com:

Get-Command java,javac | Select-Object Name,Source

PATH é a lista de locais que um terminal procura por arquivos executáveis. JAVA_HOME identifica um local do JDK para ferramentas que usam essa variável; aponte para a raiz do JDK, não para seu diretório bin. Se as duas configurações se referirem a instalações diferentes, um terminal e uma ferramenta de build podem usar versões diferentes do Java.

Verificações no macOS e Linux

Use um pacote ou instalador compatível com seu sistema operacional; consulte os guias de instalação do Temurin por plataforma para o procedimento real. Após a instalação, execute java -version e javac -version. Para inspecionar o que seu shell resolve, use:

command -v java
command -v javac

O resultado pode ser um link simbólico ou local do gerenciador de versões, então não infira a versão do Java apenas pelo caminho. Verifique também o JDK do projeto na IDE e o resultado da compilação. Selecionar um novo JDK por projeto antes de remover uma instalação antiga facilita voltar a uma configuração funcional.

Veja a compilação e execução em um pequeno exemplo

Com um JDK disponível, crie um diretório de trabalho vazio e salve este código-fonte como HelloWorld.java. Combine a capitalização do nome do arquivo com o nome da classe e certifique-se de que um editor não tenha adicionado uma extensão .txt. O exemplo não usa declaração de pacote nem bibliotecas externas.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

Abra um terminal no diretório que contém o arquivo e execute estes comandos na ordem:

javac HelloWorld.java
java -cp . HelloWorld

O primeiro comando cria um arquivo de classe. O segundo procura no diretório atual (.) pela classe HelloWorld e a executa. Não adicione .class ao nome da classe. A saída esperada é:

Hello, Java!

O JDK 11 e versões posteriores também podem executar diretamente um arquivo de código-fonte com java HelloWorld.java. Isso realiza a compilação internamente, portanto, o nome do iniciador não implica que um JRE apenas de runtime possa executar a mesma operação. O exemplo em dois passos torna visível a distinção entre código-fonte e classe. Consulte a referência java sobre execução de arquivos de código-fonte para conhecer suas condições.

Para empacotar a classe compilada em um JAR executável, execute o seguinte no mesmo diretório depois que HelloWorld.class tiver sido criado:

jar --create --file hello.jar --main-class HelloWorld HelloWorld.class
java -jar hello.jar

Criar o arquivo usa uma ferramenta de desenvolvimento; executar este JAR finalizado requer um runtime compatível. Outros aplicativos podem necessitar de bibliotecas adicionais ou opções de inicialização. Consulte a referência do comando jar para opções de criação de arquivos.

Solução de problemas comuns de instalação e execução

Sintoma O que verificar Como proceder
java ou javac não encontrado O executável existe e o PATH inclui o diretório bin do JDK pretendido Abra um terminal novo; também verifique o executável usando seu caminho completo
java funciona, javac não Um pacote apenas de tempo de execução ou caminhos de executáveis mistos Instale um JDK de desenvolvimento ou selecione o caminho de um JDK existente
UnsupportedClassVersionError Verifique se o ambiente de execução suporta a versão do arquivo de classe Use um tempo de execução compatível; reconstrua seu próprio código para a versão de destino, se apropriado
Could not find or load main class Nome da classe, diretório de trabalho e classpath Para este exemplo, execute java -cp . HelloWorld no diretório que contém HelloWorld.class
Funciona no IDE, falha no terminal JDK do projeto versus java e javac do terminal Verifique o IDE, PATH, JAVA_HOME e a seleção do JDK da ferramenta de compilação separadamente

Ao diagnosticar uma falha, primeiro determine qual executável está realmente em execução. Uma vez que os caminhos e versões estejam corretos e o pequeno exemplo funcione, investigue as dependências e opções de inicialização da aplicação.