Compiler des fichiers Java ** .class avec javac

1. Vue d’ensemble

Ce tutoriel présente l’outil javac et explique comment l’utiliser pour compiler des fichiers source Java en fichiers de classe.

Nous allons commencer par une brève description de la commande javac , puis examiner l’outil plus en profondeur en examinant ses différentes options.

** 2. La commande javac

Nous pouvons spécifier des options et des fichiers sources lors de l’exécution de l’outil javac :

javac[options][source-files]----

Où __[options]__ désigne les options contrôlant les opérations de l'outil, et __[fichiers-source]__ indique un ou plusieurs fichiers source à compiler.

Toutes les options sont en effet entièrement optionnelles. Les fichiers source peuvent être spécifiés directement en tant qu'arguments de la commande __javac__ ou conservés dans un fichier d'arguments référencé, comme décrit plus loin. **  Notez que les fichiers source doivent être organisés dans une hiérarchie de répertoires correspondant aux noms complets des types qu’ils contiennent ** .

Les options de __javac__ sont classées en trois groupes: standard, compilation croisée et extra. Dans cet article, nous allons nous concentrer sur les options standard et supplémentaires.

Les options de compilation croisée sont utilisées pour le cas d’utilisation moins courant de la compilation de définitions de types sur une implémentation de machine virtuelle Java différente de celle du compilateur et ne seront pas traitées.

===  **  3. Type Définition **

Commençons par présenter le cours que nous allons utiliser pour illustrer les options de __javac__:

[source,java,gutter:,true]

public class Data { List<String> textList = new ArrayList();

public void addText(String text) {
    textList.add(text);
}
    public List getTextList() {
        return this.textList;
    }
}
Le code source est placé dans le fichier __com/baeldung/javac/Data.java__.

Notez que nous utilisons des séparateurs de fichiers **  nix dans cet article; sur les machines Windows, nous devons utiliser la barre oblique inverse (‘__ \’ __) au lieu de la barre oblique suivante (‘__/’ __).

===  **  4. Options standard **

L'une des options standard les plus couramment utilisées de la commande __javac__ est __-d__, **  spécifiant le répertoire de destination des fichiers de classe générés ** .

Si un type ne fait pas partie du package par défaut, une structure de répertoire reprenant le nom du package est créée pour conserver le fichier de classe de ce type.

Exécutons la commande suivante dans le répertoire contenant la structure fournie dans la section précédente:

[source,bash,gutter:,true]

javac -d javac-target com/baeldung/javac/Data.java

Le compilateur __javac__ générera le fichier de classe __javac-target/com/baeldung/javac/Data.class__. Notez que sur certains systèmes, __javac__ ne crée pas automatiquement le répertoire cible, qui est __javac-target__ dans ce cas. Par conséquent, nous devrons peut-être le faire manuellement.

Voici quelques autres options fréquemment utilisées:

**  **  __- cp__ (ou __-classpath__, __ – class-path__) - **  spécifie où les types

nécessaires pour compiler nos fichiers sources peuvent être trouvés. Si cette option est manquante et que la variable d'environnement __CLASSPATH__ n'est pas définie, le répertoire de travail actuel est utilisé à la place (comme c'était le cas dans l'exemple ci-dessus).

**  **  __- p__ (ou __ – module-path__) - **  indique l'emplacement des éléments nécessaires

modules d'application. Cette option est uniquement applicable à Java 9 et supérieur - veuillez vous référer au lien:/project-jigsaw-java-modularity[ce tutoriel]pour un guide du système de module Java 9.

Si nous voulons savoir ce qui se passe pendant un processus de compilation, par exemple,

quelles classes sont chargées et lesquelles sont compilées, on peut appliquer l'option __-verbose__.

La dernière option standard que nous allons couvrir est le fichier d’arguments. **  Au lieu de passer des arguments directement à l'outil __javac__, nous pouvons les stocker dans des fichiers d'arguments ** . Les noms de ces fichiers, précédés du caractère "@ __", sont ensuite utilisés comme arguments de commande.

Lorsque la commande __javac__ rencontre un argument commençant par ‘@ __ ’__, elle interprète les caractères suivants comme le chemin d’un fichier et étend le contenu du fichier dans une liste d’arguments. Les espaces et les caractères de nouvelle ligne peuvent être utilisés pour séparer les arguments inclus dans un tel fichier d'arguments.

Supposons que nous avons deux fichiers, nommés __options__ et __types__, dans le répertoire __javac-args__ avec le contenu suivant:

Le fichier __options__:

[source,text,gutter:,true]

-d javac-target -verbose

Le fichier __types__:

[source,text,gutter:,true]

com/baeldung/javac/Data.java

Nous pouvons compiler le type __Data__ comme auparavant avec les messages de détail imprimés sur la console en exécutant cette commande:

[source,bash,gutter:,true]

javac @javac-args/options @javac-args/types

Plutôt que de conserver les arguments dans des fichiers séparés ** , nous pouvons également les stocker tous dans un seul fichier ** .

Supposons qu'il existe un fichier nommé __arguments__ dans le répertoire __javac-args__:

[source,text,gutter:,true]

-d javac-target -verbose com/baeldung/javac/Data.java

Laissons ce fichier à __javac__ pour obtenir le même résultat qu'avec les deux fichiers séparés avant ____: ____

[source,bash,gutter:,true]

javac @javac-args/arguments

Notez que les options que nous avons examinées dans cette section ne sont que les plus courantes. Pour une liste complète des options __javac__ standard, consultez la page https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9____STANDARDOPTIONSFORJAVAC-7D3CC9.

===  **  5. Options supplémentaires **

Les options supplémentaires de __javac__ sont des options non standard spécifiques à l'implémentation actuelle du compilateur et pouvant être modifiées ultérieurement. Nous n’examinerons donc pas ces options en détail.

Cependant, il existe une option très utile et qui mérite d’être mentionnée, __-Xlint__. Pour obtenir une description complète des autres options supplémentaires de __javac__, veuillez consulter https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9____NONSTANDARDOPTIONSFORJAVAC-7D3A7.

**  L'option __-Xlint__ nous permet d'activer les avertissements lors de la compilation ** .

Il existe deux manières de spécifier cette option sur la ligne de commande:

**  **  __- Xlint –__ **  déclenche tous les avertissements recommandés

**  **  __- Xlint: touche[, touche]**  –__ **  active des avertissements spécifiques

Voici quelques-unes des clés __-Xlint__ les plus pratiques:

**  **  __rawtypes –__ **  met en garde sur l'utilisation de types bruts

**  **  __unchecked –__ **  met en garde sur les opérations non contrôlées

**  **  __static –__ **  met en garde sur l'accès à un membre statique à partir d'un

membre d'instance
**  **  __cast –__ **  met en garde contre les lancements inutiles

**  **  __serial –__ **  avertit que les classes sérialisables n'ont pas de

__serialversionUID__
**  **  __fallthrough –__ **  met en garde contre la chute d'un commutateur

déclaration

Créez maintenant un fichier nommé __xlint-ops__ dans le répertoire __javac-args__ avec le contenu suivant:

[source,text,gutter:,true]

-d javac-target -Xlint:rawtypes,unchecked com/baeldung/javac/Data.java

Lors de l'exécution de cette commande:

[source,bash,gutter:,true]

javac @javac-args/xlint-ops

nous devrions voir les avertissements __rawtypes__ et __unchecked__:

[source,text,gutter:,false]

com/baeldung/javac/Data.java:7: warning:[rawtypes]found raw type: ArrayList List<String> textList = new ArrayList(); ^ missing type arguments for generic class ArrayList<E> where E is a type-variable: E extends Object declared in class ArrayList com/baeldung/javac/Data.java:7: warning:[unchecked]unchecked conversion List<String> textList = new ArrayList(); ^ required: List<String> found: ArrayList …​

===  **  6. Conclusion**

Ce didacticiel décrit l’outil __javac__ et montre comment utiliser les options pour gérer le processus de compilation typique.

En réalité, nous compilons habituellement un programme en utilisant un IDE ou un outil de construction plutôt que de nous appuyer directement sur __javac__. Cependant, une solide compréhension de cet outil nous permettra de personnaliser la compilation dans des cas d’utilisation avancés.

Comme toujours, le code source de ce tutoriel se trouve à l'adresse https://github.com/eugenp/tutorials/tree/master/core-java/[over sur GitHub].