Menu

Comment exécuter Java : compiler avec javac et exécuter avec java

Le cycle en deux étapes compiler-puis-exécuter derrière chaque programme Java : transformez le source .java en bytecode avec javac, puis exécutez le fichier .class avec java.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Compiler, puis exécuter

Maintenant que vous avez un JDK installé, exécuter Java est un cycle en deux étapes. Contrairement à un langage de script où vous pointez un interpréteur vers un fichier et c'est parti, Java compile d'abord votre source lisible par un humain en bytecode, puis une étape distincte exécute ce bytecode sur la JVM.

Ces deux étapes correspondent à deux outils en ligne de commande livrés avec le JDK :

  • javac - le compilateur. Il lit Main.java et écrit Main.class (bytecode).
  • java - le lanceur. Il démarre la JVM et exécute le bytecode de Main.class.

Vous pouvez exécuter n'importe quel exemple autonome ici même sur la page - l'éditeur ci-dessous fait les deux étapes pour vous. Mais il vaut la peine de comprendre ce qui se passe sur votre propre machine, car c'est là que vivent les vrais projets.

Les deux commandes sur votre machine

Supposons que vous ayez ce code enregistré sous Main.java :

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello from the terminal");
    }
}

Ouvrez un terminal dans le dossier qui contient le fichier et lancez le compilateur :

javac Main.java

Si le code se compile sans erreur, javac n'affiche rien et crée un nouveau fichier, Main.class, à côté de votre source. Ce fichier .class est le bytecode - ce n'est pas du texte lisible et il n'est pas lié à votre système d'exploitation.

Maintenant, lancez-le avec la commande java :

java Main
Hello from the terminal

L'erreur de débutant la plus fréquente est ici : pour lancer le programme, vous exécutez java, pas javac, et vous passez le nom de la classe sans extension. C'est java Main - jamais java Main.class ni java Main.java.

Le nom du fichier doit correspondre à la classe publique

Java impose une règle qui surprend les nouveaux venus : une classe public doit se trouver dans un fichier portant exactement le même nom, plus .java. Une public class Main doit être dans Main.java. Faites une erreur de casse et javac refuse de compiler.

// This is in a file called Greeting.java
public class Greeting {   // ERROR: class Greeting should be in Greeting.java... wait, it is
    public static void main(String[] args) {
        System.out.println("Hi");
    }
}

Le décalage qui piège vraiment les gens est plus subtil - nommer le fichier greeting.java (en minuscules) alors que la classe est Greeting, ou enregistrer Main.java mais écrire public class Hello. Le compilateur signale quelque chose comme :

Main.java:1: error: class Hello is public, should be declared in a file named Hello.java

La solution est toujours la même : faites en sorte que le nom du fichier et celui de la classe publique soient identiques, caractère pour caractère.

Le raccourci : exécuter un seul fichier directement

Depuis le JDK 11, vous pouvez sauter l'étape de compilation explicite pour un seul fichier source. La commande java le compilera en mémoire et l'exécutera d'un coup - aucun fichier .class n'est écrit sur le disque :

java Main.java

C'est parfait pour les expériences rapides et les petits scripts. Remarquez la différence dans ce que vous passez :

  • java Main - exécute un Main.class déjà compilé.
  • java Main.java - compile et exécute le fichier source d'un seul coup.

Le mode fichier unique ne fonctionne que lorsque tout votre programme tient dans un seul fichier. Dès que vous répartissez le code entre plusieurs classes dans plusieurs fichiers, vous revenez à compiler d'abord avec javac. Pour apprendre les bases, le mode fichier unique garde la boucle courte.

Passer des arguments à votre programme

Vous vous souvenez du String[] args dans main ? Ce sont les arguments de la ligne de commande. Tout ce que vous tapez après le nom de la classe dans la commande java atterrit dans ce tableau :

Sur votre propre machine, vous lui passeriez des arguments comme ceci :

java Main hello world
First argument: hello
Total arguments: 2

L'éditeur ci-dessus ne peut pas recevoir d'arguments de terminal, il exécute donc la branche « aucun argument » - mais le même code gère les deux cas. C'est ainsi que les programmes Java lisent les entrées passées au moment du lancement, bien avant que vous n'arriviez aux fichiers ou aux entrées utilisateur.

Lire les messages d'erreur du compilateur

Quand javac rejette votre code, il vous indique le fichier, la ligne et ce qui n'a pas fonctionné. Apprendre à lire ces messages, c'est déjà la moitié du chemin pour vous débloquer. En voici un classique - un point-virgule manquant :

public class Main {
    public static void main(String[] args) {
        System.out.println("Oops")   // no semicolon
    }
}
Main.java:3: error: ';' expected
        System.out.println("Oops")
                                  ^
1 error

L'accent circonflexe (^) pointe vers l'endroit où le compilateur attendait quelque chose. Main.java:3 est le fichier et le numéro de ligne. Résistez à l'envie de deviner - lisez la ligne, corrigez la seule chose qu'elle nomme et recompilez. Les erreurs de compilation signifient que rien n'a encore été exécuté ; les erreurs d'exécution (qui ont une autre allure) signifient que votre programme a démarré puis a échoué.

Un programme de vérification

Exécutez ceci dans l'éditeur, ou enregistrez-le sous Main.java et faites javac Main.java puis java Main sur votre propre machine. Si vous voyez les trois lignes, votre chaîne d'outils fonctionne de bout en bout :

Trois choses apparaissent ici que vous rencontrerez bientôt pour de bon : une variable int, la concaténation de chaînes avec + et un tableau avec son .length. Pour l'instant, il suffit que le programme se compile et affiche.

Suivant : la syntaxe Java

Vous avez exécuté quelques programmes, mais nous avons survolé la ponctuation - les accolades, les points-virgules, public static void main et la raison pour laquelle chaque ligne ressemble à ce qu'elle est. La page suivante décortique la syntaxe de Java morceau par morceau, pour que la structure cesse de ressembler à du remplissage et commence à prendre tout son sens.

Questions fréquentes

Comment exécuter un programme Java ?

Enregistrez votre code dans un fichier portant le même nom que la classe publique (par exemple Main.java), ouvrez un terminal dans ce dossier et lancez deux commandes : javac Main.java pour le compiler en bytecode, puis java Main pour l'exécuter. Avec le JDK 11 ou plus récent, vous pouvez sauter la première étape pour un seul fichier et lancer directement java Main.java.

Quelle est la différence entre javac et java ?

javac est le compilateur : il lit votre source .java et produit un fichier .class rempli de bytecode. java est le lanceur : il démarre la JVM et exécute le bytecode d'un fichier .class. Vous compilez une fois avec javac, puis vous exécutez autant de fois que vous le souhaitez avec java.

Pourquoi est-ce que j'obtiens « could not find or load main class » ?

Presque toujours parce que vous avez passé le mauvais nom à java. Utilisez le nom de la classe, pas celui du fichier : c'est java Main, pas java Main.class ni java Main.java. Assurez-vous aussi d'être dans le dossier qui contient Main.class et que le nom de la classe correspond exactement à celui du fichier, casse comprise.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER