La compilation est, en un mot, un code source écrit de manière conviviale. C'est le travail de traduction dans un langage machine que la machine peut comprendre.
Le mécanisme de compilation Java est unique et la commande javac est le code source. Compilez en quelque chose appelé code d'octet Java (code intermédiaire).
La raison pour laquelle il n'est pas converti en langage machine est Il s'agit de réaliser la philosophie de base de Java "Ecrire une fois, exécuter n'importe où". Si vous convertissez le code source directement en langage machine, le langage machine compilé sera Il deviendra "dépendant" de l'environnement dans lequel il a été compilé, Parce que la JVM implémente la possibilité de convertir le code d'octet Java en langage machine Tant que vous installez la JVM, vous pourrez exécuter Java dans n'importe quel environnement. En d'autres termes, «Une fois que vous avez écrit le code source, vous pouvez l'exécuter même dans des environnements différents».
La compilation lors de l'exécution de javac est la suivante.
L'important ici est "1. Tapez la recherche". Java a besoin de tous les types d'informations dont la classe spécifiée a besoin lors de la compilation. Plus précisément, les types requis sont les suivants.
--Classes et interfaces utilisées dans le code source --Classes et interfaces implicitement héritées et implémentées dans votre classe
Notez les classes qui sont implicitement héritées et implémentées.
Par exemple, pour compiler la classe java.util.ArrayList, ArrayList hérite
Il nécessite également des informations d'interface telles que Serializable, Iterable
Il existe plusieurs zones dans la cible de recherche de type, et l'ordre dans lequel elles sont recherchées est fixe. Les zones à rechercher sont les suivantes. (Classés dans l'ordre dans lequel ils sont recherchés)
<JAVA_HOME> / lib```.L'ordre de recherche ci-dessus est Il en va de même pour les chargeurs de classe qui chargent les informations de classe en mémoire au moment de l'exécution. Pour plus d'informations sur le chargeur de classe, consultez Qu'est-ce qu'un chargeur de classe.
Lorsque vous exécutez javac, la recherche sera effectuée dans l'ordre ci-dessus Si le même type est détecté plus d'une fois, les informations de la zone avec la priorité de recherche la plus élevée seront utilisées.
Au moment de la compilation, les fichiers trouvés par type de recherche dépendent de la situation Il peut s'agir d'un fichier de classe, d'un fichier source ou des deux. Le traitement effectué par javac est divisé en trois selon le type et la situation du fichier trouvé.
[Si seul le fichier de classe est trouvé] Utilisez le fichier de classe tel quel sans le compiler
[Si seul le fichier source est trouvé] Compilez le fichier source et utilisez le fichier de classe généré
[Si les deux sont trouvés] ~ Si le fichier de classe est plus ancien que le fichier source ~ Compilez le fichier source et utilisez le dernier fichier de classe généré ~ Autre que ce qui précède ~ Utilisez le fichier de classe tel quel sans le compiler
Lors du développement, j'utilise le SDK Java2, donc javac est le SDK Java2 Compilez pour les classes bootstrap, mais avec JDK 1.4 au lieu de Java 2 SDK Vous pouvez également utiliser la classe bootstrap.
Dans ces cas, l'option
-target 1.4 '' permet un fichier de classe compatible avec les VM 1.4.
Et utilisez -bootclasspath '' et
-extdirs '' pour créer une classe d'amorçage JDK 1.4
Spécifie pour compiler.
De cette façon, la fonction de compilation entre les versions, etc. Il s'appelle ** cross-compile **.
Maintenant que vous comprenez tous les termes relatifs à la compilation Java Jetons un coup d'œil aux options permettant de définir divers paramètres et spécifications.
--- encodage <code de caractère>
Spécifiez le code de caractère du fichier source. Par défaut
Convertisseur de plateforme Java (code source ↔︎ conversion de code d'octet Java)
Utilisez le codage défini sur.
--- sourcepath
--- cible
Générez un fichier de classe à exécuter sur une machine virtuelle avec JDK 1.1 ou version ultérieure.
- 1.2
Générez un fichier de classe qui ne fonctionne pas sur les VM antérieures à JDK 1.2.
- 1.3
Générez un fichier de classe qui ne fonctionne pas sur les VM antérieures à JDK 1.3.
- 1.4
Générez un fichier de classe qui ne fonctionne pas sur les VM antérieures à JDK 1.4.
- 1.5
Générez des fichiers de classe compatibles uniquement avec les machines virtuelles JDK 5.
- 5
Synonyme de 1.5.
--- bootclasspath
Les informations suivantes sont nécessaires pour exécuter UseCommons.java.
--Classe avec la méthode principale (UseCommons.java)
Pour collecter les informations ci-dessus, la commande javac a besoin des informations suivantes:
Les commandes spécifiques sont les suivantes.
#Le répertoire actuel est/java-sample/src
$ javac -cp /java-sample/lib/commons-lang3-3.10.jar:/java-sample/src com/example/app/UseCommons.java
Ce qui suit est la spécification du chemin de classe.
#Spécifiez le chemin de classe du fichier JAR(Précisez jusqu'au fichier)
/java-sample/lib/commons-lang3-3.10.jar
#Spécifiez le chemin de classe du fichier de classe(Ne spécifiez pas jusqu'au fichier)
/java-sample/src
#Comme mentionné ci-dessus, lors de la spécification de plusieurs chemins de classe:(Pour les fenêtres;)Se connecter avec
-cp /java-sample/lib/commons-lang3-3.10.jar:/java-sample/src
Spécifie la dernière classe à exécuter.
#Dans l'exemple, il est spécifié par le chemin relatif du répertoire courant.
com/example/app/UseCommons.java
Voici les résultats de l'exécution.
Si vous regardez, vous verrez qu'un fichier xxx.class portant le même nom que xxx.java a été créé. De plus, pour les classes définies dans UseCommons, UseCommons $ CommonsHelper.class Un fichier au format `` nom de classe $ nom de classe interne.classe '' est créé.
Vous pouvez compiler plusieurs fichiers à l'aide d'expressions régulières. Dans ce cas, le chemin de la classe vers la classe requise par la classe cible Tout doit être réglé.
#Compilez toutes les classes dans plusieurs répertoires
javac multiple/*.java
#Compilez toutes les classes appelées ~ Target dans plusieurs répertoires
javac multiple/*Target.java
Dans les exemples jusqu'à présent, le fichier de classe est créé dans le même répertoire, donc Il faut un effort supplémentaire pour créer un fichier JAR, et les dossiers ne sont pas organisés et difficiles à voir. Dans ce cas, utilisez l'option -d pour stocker le fichier de classe et -sourcepath pour stocker le fichier source. Vous pouvez spécifier la destination de stockage.
#Une fois exécuté, directement sous src.le fichier java est directement sous les classes.le fichier de classe est stocké
javac -sourcepath src -d classes /src/com/example/app/Sample.java
L'exemple suivant suppose une plate-forme avec le SDK Java2 défini comme prérequis. Lorsque vous exécutez la commande suivante, ce n'est pas l'API de plate-forme Java2 du SDK Java2, mais Il sera maintenant compilé à l'aide de l'API principale de JDK 1.4.
Supplément: À propos de la valeur de paramétrage de -boot class path -bootclasspath contient des répertoires, des fichiers JAR, des fichiers ZIP, etc. Puisqu'il peut être spécifié, un fichier JAR qui stocke les classes d'amorçage ensemble est stocké indépendamment. Sa création vous évite d'avoir à spécifier plusieurs entrées.
# -target 1.4:JDK1.Générer un fichier de classe compatible avec 4 et plus
# -bootclasspath <chemin>:指定したcheminにあるブートストラップクラスを使用してコンパイルを行う
javac -target 1.4 -bootclasspath <Emplacement de l'archive de la classe Bootstrap> Sample.java
Supplément: Comment vérifier l'emplacement de stockage de la classe bootstrap L'emplacement de stockage de la classe bootstrap est Il est défini dans la propriété système sun.boot.class.path.
Utilisez un fichier appelé fichier d'argument de ligne de commande pour javac Il existe un mécanisme pour spécifier plusieurs classes et plusieurs options, mais en tirer pleinement parti Compte tenu du coût, je pense qu'il vaut mieux étudier l'outil de construction, je vais donc l'omettre.
Recommended Posts