W3docs

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 .java et produit des fichiers .class.
  • java — le lanceur. Charge la JVM, trouve une classe par son nom et exécute sa méthode main.
  • 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 --version

Compiler 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.java

S'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 Greeting
Hello 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 out indique à javac de placer les fichiers .class générés dans le répertoire out/ (en recréant la structure de répertoires du package).
  • -cp out indique à java de chercher les classes sur le classpath out/.
  • com.example.greet.Greeting est 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.java

Le 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.

Note

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> /exit

Vous 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 javacjava sur notre serveur à chaque fois que vous appuyez sur Run :

java— editable, runs on the server

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, un import manquant, 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, ou javac pointe 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.

Pratique

Pratique
Quelle commande compile Greeting.java en bytecode ?
Quelle commande compile Greeting.java en bytecode ?
Was this page helpful?