Comment compiler et exécuter un programme Java
Utilisez javac pour compiler des fichiers .java en bytecode .class et le lanceur java pour les exécuter sur la JVM.
Un programme Java passe par deux étapes avant de produire un résultat. D'abord, le compilateur transforme vos fichiers source .java en bytecode neutre sur le plan de la plateforme (fichiers .class). Ensuite, la JVM charge ce bytecode et l'exécute. Comprendre ces deux étapes vous permet de raisonner sur les erreurs de classpath, l'empaquetage et les cas limites étranges qui surgissent parfois.
Ce chapitre passe en revue la chaîne d'outils — javac, java et jshell — ainsi que la structure de fichiers attendue par ces outils.
La chaîne d'outils
Lorsque vous installez le JDK, vous obtenez trois commandes que vous utiliserez constamment :
javac— le compilateur Java. Prend des fichiers source.javaet produit des fichiers.class.java— le lanceur. Charge la JVM, trouve une classe par son nom et exécute sa méthodemain.jshell— un REPL interactif (read-eval-print loop) pour tester des extraits de code sans écrire un programme complet. Ajouté dans Java 9.
Vous pouvez vérifier leur disponibilité en exécutant chacun avec -version :
javac -version
java -version
jshell --versionCompiler un seul fichier source
Supposons que vous ayez ce fichier enregistré sous le nom Greeting.java :
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello from javac!");
}
}Compilez-le :
javac Greeting.javaS'il n'y a pas d'erreurs, vous verrez un nouveau fichier dans le même répertoire appelé Greeting.class. C'est le bytecode. Exécutez-le :
java GreetingHello from javac!Notez que vous passez le nom de la classe, pas le nom du fichier. java Greeting.class est incorrect ; java Greeting.java l'est aussi.
Compiler un programme avec des packages
Les programmes réels sont organisés en packages qui reflètent leur structure de répertoires. Une classe déclarée comme package com.example.greet; doit se trouver dans 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!");
}
}Depuis le répertoire project/, compilez et exécutez avec le nom de classe pleinement qualifié :
javac -d out src/com/example/greet/Greeting.java
java -cp out com.example.greet.Greeting-d outindique àjavacde placer les fichiers.classgénérés dans le répertoireout/(en recréant la structure de répertoires du package).-cp outindique àjavade chercher les classes sur le classpathout/.com.example.greet.Greetingest le nom de classe pleinement qualifié — le package, un point, et la classe.
En pratique, vous utiliseriez un outil de build (Maven ou Gradle, abordés plus loin dans ce livre) pour faire tout cela. Mais savoir ce qu'ils font en coulisses aide quand quelque chose se casse.
Mode fichier source (programmes à fichier unique)
Depuis Java 11, vous pouvez ignorer javac complètement pour les programmes à un seul fichier :
java Greeting.javaLe lanceur compile en mémoire et exécute le résultat immédiatement — aucun fichier .class n'est écrit sur le disque. C'est idéal pour les scripts rapides et les exercices du livre.
Le mode fichier source ne fonctionne que lorsque le programme tient dans un seul fichier .java. Dès que vous répartissez votre code sur deux fichiers source, repassez à javac (ou un outil de build) pour les compiler ensemble.
jshell — le REPL interactif
jshell vous permet de saisir des expressions et des instructions Java une ligne à la fois, comme un 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> /exitVous n'avez pas besoin d'une classe, d'une méthode main, ni même de points-virgules pour les expressions simples. C'est un excellent moyen d'explorer la bibliothèque standard sans configurer un projet.
Exécuter depuis l'IDE
Chaque IDE Java — IntelliJ, Eclipse, VS Code — invoque javac et java en coulisses lorsque vous cliquez sur Run. L'IDE gère également le classpath, affiche les erreurs du compilateur en ligne et montre la sortie du programme dans un panneau console. Vous n'êtes pas obligé d'utiliser la ligne de commande, mais savoir ce que fait l'IDE rend le débogage des problèmes de build beaucoup plus rapide.
Un exemple en direct
Le bloc exécutable ci-dessous passe par le même cycle javac → java sur notre serveur à chaque fois que vous appuyez sur Run :
Modifiez le code, appuyez sur Run, et le serveur compile votre source modifiée et affiche ce que le programme produit.
Erreurs de compilation courantes
Quelques erreurs que vous rencontrerez souvent :
class Greeting is public, should be declared in a file named Greeting.java— le nom du fichier et le nom de la classe publique doivent correspondre exactement.error: cannot find symbol— généralement une faute de frappe, unimportmanquant, ou une classe absente du classpath.';' expected— un point-virgule manquant à la fin d'une instruction.error: package x.y.z does not exist— le répertoire du package n'est pas sur le classpath, oujavacpointe vers la mauvaise racine source.
En cas de doute, lisez le message d'erreur — les diagnostics de javac sont remarquablement clairs.
Et ensuite
Maintenant que vous maîtrisez les outils, la suite du livre aborde le langage lui-même : Variables Java, Types de données et le reste des bases syntaxiques.