Compilation de fichiers Java * .class avec javac

1. Vue d'ensemble

Ce didacticiel présentera l' outil javac et décrit comment l'utiliser pour compiler des fichiers source Java en fichiers de classe.

Nous commencerons par une brève description de la commande javac , puis examinerons l'outil plus en profondeur en examinant ses différentes options.

2. La commande javac

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

javac [options] [source-files]

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

Toutes les options sont en effet entièrement optionnelles. Les fichiers source peuvent être directement spécifiés comme 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 nous concentrerons 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 type contre une implémentation JVM différente de l'environnement du compilateur et ne seront pas traitées.

3. Définition du type

Commençons par présenter la classe que nous allons utiliser pour démontrer les options javac :

public class Data { List 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 (' /' ).

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épertoires reflétant 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:

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 pouvons avoir besoin de le faire manuellement.

Voici quelques autres options fréquemment utilisées:

  • -cp (ou -classpath , –class -path ) - spécifie où les types requis pour compiler nos fichiers source 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 modules d'application nécessaires. Cette option s'applique uniquement à Java 9 et supérieur - veuillez vous référer à ce didacticiel 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, nous pouvons appliquer l' option -verbose .

La dernière option standard que nous aborderons 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'accès à un fichier et développe 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 ayons deux fichiers, des options nommées et des types , dans le répertoire javac-args avec le contenu suivant:

Le fichier d' options :

-d javac-target -verbose

Le fichier types :

com/baeldung/javac/Data.java

Nous pouvons compiler le type de données comme avant avec des messages de détail imprimés sur la console en exécutant cette commande:

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 y ait un fichier nommé arguments dans le répertoire javac-args :

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

Transmettons ce fichier à javac pour obtenir le même résultat qu'avec les deux fichiers séparés précédents :

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 cette référence.

5. Options supplémentaires

Les options supplémentaires de javac sont des options non standard, qui sont spécifiques à l'implémentation actuelle du compilateur et peuvent être modifiées à l'avenir. En tant que tel, nous ne passerons pas en revue ces options en détail.

Cependant, il existe une option très utile et qui mérite d'être mentionnée, -Xlint . Pour une description complète des autres options supplémentaires javac , suivez ce lien.

L' option -Xlint nous permet d'activer les avertissements lors de la compilation . Il existe deux façons de spécifier cette option sur la ligne de commande:

  • -Xlint - déclenche tous les avertissements recommandés
  • -Xlint: key [, key] * - active des avertissements spécifiques

Voici quelques-unes des touches -Xlint les plus pratiques :

  • rawtypes – warns about the use of raw types
  • unchecked – warns about unchecked operations
  • static – warns about the access to a static member from an instance member
  • cast – warns about unnecessary casts
  • serial – warns about serializable classes not having a serialversionUID
  • fallthrough – warns about the falling through in a switch statement

Now, create a file named xlint-ops in the javac-args directory with the following content:

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

When running this command:

javac @javac-args/xlint-ops

we should see the rawtypes and unchecked warnings:

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

6. Conclusion

Ce tutoriel a parcouru l' outil javac , montrant comment utiliser les options pour gérer le processus de compilation typique.

En réalité, nous compilons généralement un programme en utilisant un IDE ou un outil de construction plutôt que de compter 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 didacticiel se trouve à l'adresse over sur GitHub.