JRE et JDK : différences, rôle de la JVM et package Java à choisir

Un JRE (Java Runtime Environment) exécute des programmes Java compilés. Un JDK (Java Development Kit) fournit des capacités d'exécution ainsi qu'un compilateur et des outils de développement ; choisissez un JDK lorsque vous apprenez Java ou construisez du code source. Pour exécuter une application existante, suivez ses exigences d'exécution ; une application qui inclut son propre environnement d'exécution peut ne nécessiter aucune installation Java séparée.

Qu'est-ce qu'un JRE ?

Un JRE est l'environnement nécessaire pour exécuter des programmes Java compilés. Il combine une JVM (Machine Virtuelle Java), des bibliothèques de classes standard et des fichiers d'exécution complémentaires. Le bytecode est le format d'instruction utilisé par la JVM, généralement stocké dans des fichiers .class produits à partir du code source Java.

Un package JRE classique uniquement pour l'exécution ne fournit pas le compilateur de source javac. Être capable d'exécuter java ne prouve donc pas que les outils de développement sont installés. Il faut également distinguer le concept d'environnement d'exécution des noms de packages disponibles sur un site de téléchargement particulier.

Qu'est-ce qu'un JDK ?

Un JDK fournit des outils pour développer et exécuter des programmes Java. Utilisez javac pour compiler des fichiers source et java pour exécuter des programmes. Un JDK de développement fournit déjà des capacités d'exécution, vous n'avez donc pas besoin d'une seconde installation de JRE simplement pour exécuter des programmes avec ce JDK.

  • javac compile les fichiers source .java en fichiers .class.
  • java démarre la JVM et lance un programme Java.
  • jar regroupe les classes et les ressources dans un fichier JAR (Java Archive).
  • javadoc génère la documentation API (Application Programming Interface) à partir des déclarations et des commentaires de documentation.
  • jdb prend en charge le débogage, y compris l'arrêt de l'exécution et l'inspection des variables.

Cela ne signifie pas qu'un JDK inclut tous les éditeurs ou IDE (environnements de développement intégrés). Vous pouvez choisir un éditeur séparément, et un IDE peut nécessiter que vous sélectionniez un JDK de projet pour compiler le code. Le rôle du compilateur est décrit dans la référence javac d'Oracle .

Comment la JVM, le JRE et le JDK sont-ils liés ?

La JVM est le composant qui exécute le bytecode. Un JRE ajoute des bibliothèques et des fichiers de support pour former un environnement d'exécution ; un JDK ajoute des outils de développement tout en fournissant également des capacités d'exécution. Ces termes décrivent différents rôles et portées.

Par exemple, javac transforme HelloWorld.java en HelloWorld.class, et java HelloWorld lance le programme sur une JVM. Un fichier de classe peut s'exécuter sur un autre système d'exploitation avec un environnement d'exécution compatible, mais les applications utilisant des bibliothèques natives ou des versions particulières de Java ont des exigences supplémentaires. Voir Introduction de la spécification de la Java Virtual Machine pour la relation entre la JVM et les fichiers de classe.

Comparaison JRE vs JDK

Critère JRE uniquement pour l'exécution JDK
Objectif principal Exécuter des applications compilées Développer, compiler et exécuter des applications
JVM et bibliothèques d'exécution Inclus Inclus
Lanceur java Généralement disponible Disponible
Compilateur javac Généralement absent Disponible
Quand le choisir Une application nécessite un runtime externe compatible Apprendre Java, construire du code source ou travail de développement
Disponibilité en téléchargement Dépend du fournisseur, de la version et du système d'exploitation Choisir un fournisseur et une plateforme prise en charge

Ce tableau compare les rôles habituels d'un package uniquement pour l'exécution et d'un kit de développement. Un runtime personnalisé peut contenir une sélection différente de modules, donc son nom seul ne garantit pas que chaque bibliothèque ou outil soit présent.

Un JDK moderne contient-il un dossier JRE ?

« Le JDK inclut le JRE » est une formule simplifiée utile pour parler des capacités d'exécution, mais ce n'est pas une description exacte de chaque agencement de répertoires actuel. Le JDK 8 et les versions antérieures utilisaient un répertoire interne jre/ ; le JDK 9 a introduit des images de runtime modulaires. Oracle a cessé d'offrir des téléchargements distincts de JRE et de Server JRE avec le JDK 11. Le guide de migration Oracle JDK 11 explique ces changements de packaging et d'agencement.

Cela ne signifie pas que tous les fournisseurs ont cessé de distribuer des packages uniquement pour l'environnement d'exécution. La page de téléchargement d'Eclipse Temurin distingue les packages JDK et JRE ; vérifiez ce qui est réellement disponible pour la version et le système d'exploitation dont vous avez besoin. Un changement de packaging effectué par un fournisseur n'est pas une règle universelle du Java.

Les développeurs peuvent également utiliser l'outil jlink du JDK pour assembler les modules requis et leurs dépendances dans une image d'exécution personnalisée. Intégrer un tel environnement d'exécution à une application peut réduire le besoin d'un JRE système installé séparément. La sélection des modules et les mises à jour restent sous la responsabilité du distributeur, comme expliqué dans la référence jlink.

Quel package et quelle version devriez-vous choisir ?

  • Apprentissage et développement : choisissez la version JDK requise par votre cours ou projet, y compris les versions prises en charge par les outils de compilation et les bibliothèques.
  • Exécution d'une application existante : vérifiez ses instructions d'installation pour connaître la version Java requise et si elle nécessite un runtime externe. Changer la version Java du système peut n'avoir aucun effet sur une application avec un runtime intégré.
  • Déploiement serveur : respectez les modules requis, au système d'exploitation et à l'architecture CPU. Un serveur qui compile également du code source ou nécessite les outils JDK peut nécessiter un JDK.

Un numéro de version plus élevé à lui seul ne garantit pas la compatibilité. Par exemple, un runtime Java 17 ne peut pas nécessairement lire une classe compilée pour Java 21. Exécuter une application plus ancienne sur une version plus récente de Java nécessite également de vérifier les fonctionnalités supprimées et la compatibilité des bibliothèques.

Pour votre propre code source, envisagez javac --release lorsque vous ciblez une version Java antérieure prise en charge. Cela limite les fonctionnalités du langage, les API de la plateforme et la sortie des fichiers de classes, mais ne rend pas automatiquement les dépendances externes compatibles. Testez le résultat sur le runtime cible réel.

Installez un JDK et vérifiez les exécutables sélectionnés

Sur une page de téléchargement officielle, sélectionnez le type de package, la version de Java, le système d'exploitation et l'architecture du processeur, comme x64 ou ARM64. Si le distributeur fournit des sommes de contrôle, vous pouvez vérifier le fichier téléchargé en utilisant son hachage avant l'installation.

Installation et vérifications sur Windows

Avec un installateur MSI d'Eclipse Temurin, utilisez Custom Setup pour sélectionner le répertoire d'installation et les fonctionnalités. Ajouter Java à PATH aide à l'utilisation en ligne de commande; sélectionnez la fonctionnalité JAVA_HOME si vos outils de build en ont besoin. Voir le guide d'installation de Temurin sur Windows pour ces options. Après l'installation, fermez les terminaux existants et ouvrez-en un nouveau.

java -version
javac -version

Vérifiez que les deux commandes fonctionnent et indiquent la version majeure de Java prévue. Si seule java -version fonctionne, le runtime a été trouvé mais le compilateur pourrait ne pas être disponible. Dans PowerShell, inspectez les chemins sélectionnés avec :

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

PATH est la liste des emplacements qu'un terminal recherche pour les fichiers exécutables. JAVA_HOME identifie un emplacement JDK pour les outils qui utilisent cette variable ; pointez-le vers la racine du JDK, et non vers son répertoire bin. Si les deux paramètres font référence à des installations différentes, un terminal et un outil de compilation peuvent utiliser différentes versions de Java.

Vérifications sur macOS et Linux

Utilisez un paquet ou un installateur correspondant à votre système d'exploitation ; consultez les guides d’installation de Temurin par plateforme pour la procédure réelle. Après l'installation, exécutez java -version et javac -version. Pour vérifier ce que votre shell résout, utilisez :

command -v java
command -v javac

Le résultat peut être un lien symbolique ou un emplacement de gestionnaire de versions, donc ne déduisez pas la version de Java uniquement à partir d'un chemin. Vérifiez également le JDK du projet dans l'IDE et le résultat de la compilation. Sélectionner un nouveau JDK pour chaque projet avant de supprimer une ancienne installation facilite le retour à une configuration fonctionnelle.

Compiler et exécuter un petit exemple

Avec un JDK disponible, créez un répertoire de travail vide et enregistrez cette source sous le nom HelloWorld.java. Faites correspondre la capitalisation du nom de fichier avec celle du nom de la classe, et assurez-vous qu’un éditeur n’a pas ajouté une extension .txt. L’exemple n’utilise ni déclaration de package ni bibliothèques externes.

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

Ouvrez un terminal dans le répertoire contenant le fichier, puis exécutez ces commandes dans l’ordre :

javac HelloWorld.java
java -cp . HelloWorld

La première commande crée un fichier de classe. La seconde recherche la classe HelloWorld dans le répertoire actuel (.) et l’exécute. N’ajoutez pas .class au nom de la classe. La sortie attendue est :

Hello, Java!

JDK 11 et les versions ultérieures peuvent également lancer directement un fichier source avec java HelloWorld.java. Cela effectue la compilation en interne, donc le nom du lanceur n'implique pas qu'un JRE destiné uniquement à l'exécution puisse effectuer la même opération. L'exemple en deux étapes rend visible la distinction source/classe. Voir la référence Java sur l'exécution des fichiers source pour ses conditions.

Pour empaqueter la classe compilée dans un JAR exécutable, exécutez la commande suivante dans le même répertoire après que HelloWorld.class a été créé :

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

La création de l'archive utilise un outil de développement ; l'exécution de ce JAR fini nécessite un environnement d'exécution compatible. D'autres applications peuvent nécessiter des bibliothèques supplémentaires ou des options de lancement. Voir la référence de la commande jar pour les options de création d'archive.

Dépannage des problèmes courants d'installation et de lancement

Symptôme À vérifier Comment procéder
java ou javac introuvable L'exécutable existe et le PATH inclut le répertoire bin du JDK prévu Ouvrez un nouveau terminal ; vérifiez également l'exécutable en utilisant son chemin complet
java fonctionne, javac ne fonctionne pas Un package uniquement runtime ou des chemins d'exécutables mixtes Installez un JDK de développement ou sélectionnez le chemin d'un JDK existant
UnsupportedClassVersionError Vérifier si l’environnement d’exécution prend en charge la version du fichier de classe Utilisez un environnement d'exécution compatible ; reconstruisez votre propre code pour la version cible si nécessaire
Could not find or load main class Nom de la classe, répertoire de travail et classpath Pour cet exemple, exécutez java -cp . HelloWorld dans le répertoire contenant HelloWorld.class
Fonctionne dans l'IDE, échoue dans le terminal JDK du projet versus java et javac du terminal Vérifiez séparément la sélection de l'IDE, du PATH, de JAVA_HOME et du JDK de l'outil de construction

Lors du diagnostic d’une panne, vérifiez d’abord quel exécutable est réellement lancé. Une fois les chemins et les versions corrects et le petit exemple fonctionnel, examinez les dépendances et les options de lancement de l’application.