Introduction à la commande javac

Chapitre 3 Compilation du code source

Qu'est-ce que la compilation en Java?

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

Vue d'ensemble de la commande javac

La compilation lors de l'exécution de javac est la suivante.

  1. Analyser la classe spécifiée et rechercher les types dépendants
  2. Compilez le type correspondant dans la recherche

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 , Collection , Les informations n'apparaissent pas dans le code source.

Ordre de recherche

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)

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.

Comportement pour les résultats de recherche

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

Compilation croisée

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

options de commande javac

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.

Options majeures

--- 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 Spécifiez l'emplacement du fichier source. Par défaut, le chemin de la classe utilisateur est spécifié. --- d Spécifiez l'emplacement du fichier de classe. Par défaut, le chemin de la classe utilisateur est spécifié. --- classpath (ou -cp) Spécifiez la destination de recherche de la classe d'utilisateurs. Lorsque plusieurs sélections sont effectuées, séparez-les par un point-virgule (Windows) ou un deux-points (Unix). --- source N'autorisez que des versions JDK spécifiques du code source.

Options de débogage

Options de compilation croisée

--- cible Génère un fichier de classe qui s'exécute sur la version spécifiée de VM. Par défaut, il générera un fichier de classe compatible avec la machine virtuelle JDK5. Cependant, la valeur par défaut est 1.4 uniquement si les options sous -source 1.4 sont utilisées. Les versions prises en charge de javac sont: - 1.1
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 Compilation croisée pour la classe de démarrage spécifiée. Comme le chemin de la classe utilisateur Séparez les entrées multiples dans le chemin de la classe de démarrage par un point-virgule ou deux-points. Le chemin de la classe de démarrage peut être un répertoire, une archive JAR ou une archive ZIP.

Courir

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. スクリーンショット 2020-05-25 21.23.45.png

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

Autres cas d'utilisation de la commande javac

Compiler plusieurs fichiers

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

Destinations de stockage distinctes pour les fichiers source et les fichiers de classe

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

Compilation croisée

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.

Fichier d'argument de ligne de commande

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.

Retour à la page principale

Recommended Posts

Introduction à la commande javac
Introduction à la commande javadoc
Introduction à la commande jar
Introduction à Ruby 2
Introduction à Micronaut 1 ~ Introduction ~
Introduction à la migration
Introduction à Java
Introduction à Doma
Introduction aux fichiers JAR
Introduction à Ratpack (8) - Session
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Introduction à Ratpack (9) --Thymeleaf
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction aux modèles de conception (introduction)
Introduction à Ratpack (2) -Architecture
Introduction au style lambda
Introduction au développement de Keycloak
Introduction aux modèles de conception (Builder)
Introduction à Ratpack (5) --Json & Registry
Introduction à la métabase ~ Construction de l'environnement ~
Introduction à Ratpack (7) --Guice & Spring
(Installation par points) Introduction à Java8_Impression
Introduction aux modèles de conception (composite)
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
Introduction aux modèles de conception (poids mouche)
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
Introduction au prototype de modèles de conception
[Java] Introduction à l'API Stream
Introduction aux modèles de conception (Iterator)
Introduction à Spring Boot, partie 1
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Introduction aux modèles de conception (stratégie)
[Introduction aux jeux Janken (comme)] Java
Introduction à Linux Container / Docker (Partie 1)
Introduction à la pratique rapide Chapitre 5
[Introduction à Java] À propos des expressions lambda
Introduction aux algorithmes avec somme cumulée Java
[Introduction à Java] À propos de l'API Stream
Introduction à la programmation fonctionnelle (Java, Javascript)
Aide sur les commandes OpenJDK 8 java et javac
Introduction aux algorithmes avec la méthode java-Shakutori
Introduction aux modèles de conception (méthode d'usine)
Introduction à Linux Container / Docker (Partie 2)