JRE e JDK: differenze, ruolo della JVM e pacchetto Java da installare

Un JRE (Java Runtime Environment) esegue programmi Java compilati. Un JDK (Java Development Kit) fornisce capacità di runtime oltre a un compilatore e strumenti di sviluppo, quindi scegli un JDK quando impari Java o sviluppi codice sorgente. Per eseguire un'applicazione esistente, segui i suoi requisiti di runtime; un'applicazione che include il proprio runtime potrebbe non richiedere un'installazione Java separata.

Cos'è un JRE?

Un JRE è l'ambiente necessario per eseguire programmi Java compilati. Combina una JVM (Java Virtual Machine), librerie di classi standard e file di runtime di supporto. Il bytecode è il formato di istruzioni utilizzato dalla JVM, di solito memorizzato in file .class prodotti a partire dal codice sorgente Java.

Un tipico pacchetto JRE solo per runtime non fornisce il compilatore javac sorgente. Essere in grado di eseguire java quindi non dimostra che gli strumenti di sviluppo siano installati. Inoltre, distingui il concetto di ambiente di runtime dai nomi dei pacchetti disponibili su un determinato sito di download.

Che cos'è un JDK?

Un JDK fornisce strumenti per sviluppare ed eseguire programmi Java. Usa javac per compilare i file sorgente e java per eseguire i programmi. Un JDK per lo sviluppo fornisce già capacità di esecuzione, quindi non è necessario un secondo JRE solo per eseguire programmi con quel JDK.

  • javac compila i file sorgente .java in file .class.
  • java avvia la JVM e lancia un programma Java.
  • jar impacchetta classi e risorse in un file JAR (Java Archive).
  • javadoc genera documentazione API (Application Programming Interface) dalle dichiarazioni e dai commenti di documentazione.
  • jdb supporta il debug, compreso l'arresto dell'esecuzione e l'ispezione delle variabili.

Questo non significa che un JDK includa ogni editor o IDE (Integrated Development Environment). Puoi scegliere un editor separatamente, e un IDE può richiedere di selezionare un JDK di progetto per la compilazione del codice. Il ruolo del compilatore è descritto in riferimento javac di Oracle.

Come si relazionano la JVM, il JRE e il JDK?

La JVM è il componente che esegue il bytecode. Un JRE aggiunge librerie e file di supporto per formare un ambiente runtime; un JDK aggiunge strumenti di sviluppo fornendo anche capacità runtime. Questi termini descrivono ruoli e ambiti differenti.

Ad esempio, javac trasforma HelloWorld.java in HelloWorld.class, e java HelloWorld avvia il programma su una JVM. Un file di classe può essere eseguito su un altro sistema operativo con un runtime compatibile, ma le applicazioni che utilizzano librerie native o versioni particolari di Java hanno requisiti aggiuntivi. Vedere Introduzione alle specifiche della Java Virtual Machine per la relazione tra la JVM e i file di classe.

Confronto JRE vs JDK

Criterio JRE solo runtime JDK
Scopo principale Eseguire applicazioni compilate Sviluppare, compilare ed eseguire applicazioni
JVM e librerie runtime Incluso Incluso
java launcher Tipicamente disponibile Disponibile
Compilatore javac Tipicamente assente Disponibile
Quando sceglierlo Un'applicazione richiede un runtime esterno compatibile Imparare Java, costruire codice sorgente o lavori di sviluppo
Disponibilità download Dipende dal fornitore, dalla versione e dal sistema operativo Scegliere un fornitore e una piattaforma supportata

Questa tabella confronta i ruoli usuali di un pacchetto solo runtime e di un kit di sviluppo. Un runtime personalizzato può contenere una selezione diversa di moduli, quindi solo il suo nome non garantisce che tutte le librerie o gli strumenti siano presenti.

Un JDK moderno contiene una cartelil JRE?

“Il JDK include il JRE” è un'abbreviazione utile per le capacità di runtime, ma non è una descrizione accurata di ogni layout di directory attuale. JDK 8 e versioni precedenti utilizzavano una directory interna jre/; JDK 9 ha introdotto immagini modulari del runtime. Oracle ha smesso di offrire download separati di JRE e Server JRE con JDK 11. La guida alla migrazione Oracle JDK 11 spiega questi cambiamenti di impacchettamento e layout.

Questo non significa che tutti i fornitori abbiano smesso di distribuire pacchetti solo runtime. La pagina di download di Eclipse Temurin distingue tra pacchetti JDK e JRE; verifica cosa è effettivamente disponibile per la versione e il sistema operativo richiesti. Una modifica del packaging fatta da un fornitore non è una regola universale di Java.

Gli sviluppatori possono anche usare lo strumento jlink del JDK per assemblare i moduli richiesti e le loro dipendenze in un'immagine runtime personalizzata. Includere tale runtime con un'applicazione può ridurre la necessità di avere un JRE di sistema installata separatamente. La selezione dei moduli e gli aggiornamenti rimangono responsabilità del distributore, come spiegato nel riferimento jlink.

Quale pacchetto e versione dovresti scegliere?

  • Apprendimento e sviluppo: scegli la versione JDK richiesta dal tuo corso o progetto, comprese le versioni supportate dagli strumenti di build e dalle librerie.
  • Esecuzione di un'applicazione esistente: controlla le istruzioni di installazione per la versione Java richiesta e se è necessario un runtime esterno. Cambiare Java di sistema potrebbe non avere effetto su un'applicazione con un runtime incluso.
  • Distribuzione su server: abbina i moduli richiesti, il sistema operativo e l'architettura della CPU. Un server che sviluppa anche codice sorgente o necessita degli strumenti JDK potrebbe richiedere un JDK.

Un numero di versione più grande da solo non garantisce la compatibilità. Ad esempio, un runtime Java 17 non può necessariamente leggere una classe compilata per Java 21. Eseguire un'applicazione più vecchia su Java più recente richiede anche di verificare le funzionalità rimosse e la compatibilità delle librerie.

Per il tuo codice sorgente, considera javac --release quando punti a una versione Java precedente supportata. Limita le funzionalità del linguaggio, le API della piattaforma e l'output dei file di classe, ma non rende automaticamente compatibili le dipendenze esterne. Testa il risultato sul runtime di destinazione effettivo.

Installa un JDK e controlla gli eseguibili selezionati

Su una pagina di download ufficiale, seleziona il tipo di pacchetto, la versione di Java, il sistema operativo e l'architettura della CPU, come x64 o ARM64. Se il distributore fornisce checksum, puoi verificare il file scaricato utilizzando il suo hash prima dell'installazione.

Installazione e controlli su Windows

Con un installer MSI di Eclipse Temurin, usa Custom Setup per selezionare la directory di installazione e le funzionalità. Aggiungere Java a PATH facilita l'uso da riga di comando; seleziona la funzionalità JAVA_HOME se i tuoi strumenti di build ne hanno bisogno. Consulta la guida all'installazione di Temurin su Windows per queste opzioni. Dopo l'installazione, chiudi i terminali esistenti e aprine uno nuovo.

java -version
javac -version

Verifica che entrambi i comandi funzionino e riportino la versione principale di Java prevista. Se funziona solo java -version, il runtime è stato trovato ma il compilatore potrebbe non essere disponibile. In PowerShell, controlla i percorsi selezionati con:

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

PATH è l'elenco dei percorsi in cui un terminale cerca i file eseguibili. JAVA_HOME identifica una posizione JDK per gli strumenti che utilizzano quella variabile; punta alla radice del JDK, non alla sua directory bin. Se le due impostazioni si riferiscono a installazioni diverse, un terminale e uno strumento di compilazione possono usare versioni di Java differenti.

Controlli su macOS e Linux

Usa un pacchetto o un programma di installazione compatibile con il tuo sistema operativo; consulta le guide di installazione di Temurin per piattaforma per la procedura effettiva. Dopo l'installazione, esegui java -version e javac -version. Per verificare cosa risolve la tua shell, usa:

command -v java
command -v javac

Il risultato potrebbe essere un collegamento simbolico o una posizione del gestore delle versioni, quindi non dedurre la versione di Java solo da un percorso. Controlla anche il JDK del progetto nell'IDE e il risultato della build. Selezionare un nuovo JDK per progetto prima di rimuovere un'installazione precedente facilita il ritorno a una configurazione funzionante.

Compilare ed eseguire un piccolo esempio

Con un JDK disponibile, crea una directory di lavoro vuota e salva questo sorgente come HelloWorld.java. Abbina la capitalizzazione del nome del file a quella del nome della classe e assicurati che un editor non abbia aggiunto un'estensione .txt. L'esempio non utilizza dichiarazioni di pacchetto o librerie esterne.

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

Apri un terminale nella directory contenente il file, poi esegui questi comandi in ordine:

javac HelloWorld.java
java -cp . HelloWorld

Il primo comando crea un file di classe. Il secondo cerca nella directory corrente (.) la classe HelloWorld e la esegue. Non aggiungere .class al nome della classe. L'output previsto è:

Hello, Java!

JDK 11 e versioni successive possono anche lanciare direttamente un file sorgente con java HelloWorld.java. Questo esegue la compilazione internamente, quindi il nome del launcher non implica che un JRE solo per l'esecuzione possa eseguire la stessa operazione. L'esempio in due passaggi rende visibile la distinzione tra sorgente e classe. Vedi il riferimento java sull'esecuzione dei file sorgente per le sue condizioni.

Per impacchettare la classe compilata in un JAR eseguibile, esegui quanto segue nella stessa directory dopo che HelloWorld.class è stato creato:

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

La creazione dell'archivio utilizza uno strumento di sviluppo; l'esecuzione di questo JAR completato richiede un runtime compatibile. Altre applicazioni possono necessitare di librerie aggiuntive o opzioni di avvio. Vedi il riferimento del comando jar per le opzioni di creazione dell'archivio.

Risoluzione dei problemi comuni di installazione e avvio

Sintomo Cosa controllare Come procedere
java o javac non trovati L'eseguibile esiste e PATH include la directory bin del JDK desiderato Apri un nuovo terminale; controlla anche l'eseguibile usando il percorso completo
java funziona, javac no Un pacchetto solo runtime o percorsi eseguibili misti Installa un JDK di sviluppo o seleziona il percorso di un JDK esistente
UnsupportedClassVersionError Verifica se il runtime supporta la versione del file di classe Usa un ambiente di esecuzione compatibile; ricompila il tuo codice per la release di destinazione se appropriato
Could not find or load main class Nome della classe, directory di lavoro e classpath Per questo esempio, esegui java -cp . HelloWorld nella directory che contiene HelloWorld.class
Funziona nell'IDE, fallisce nel terminale JDK del progetto rispetto a java e javac del terminale Controlla separatamente IDE, PATH, JAVA_HOME e la selezione del JDK dello strumento di compilazione

Durante la diagnosi di un problema, verifica prima quale eseguibile viene effettivamente avviato. Quando percorsi e versioni sono corretti e il piccolo esempio funziona, controlla le dipendenze e le opzioni di avvio dell’applicazione.