Einführung in den Befehl javac

Kapitel 3 Kompilieren des Quellcodes

Was ist Kompilierung in Java?

Das Kompilieren ist, kurz gesagt, Quellcode, der menschlich geschrieben wurde. Es ist die Arbeit, in eine Maschinensprache zu übersetzen, die die Maschine verstehen kann.

Der Mechanismus der Java-Kompilierung ist einzigartig und der Befehl javac ist der Quellcode. Kompilieren Sie zu etwas, das als Java-Bytecode (Zwischencode) bezeichnet wird.

Der Grund, warum es nicht in Maschinensprache konvertiert wird, ist Dies dient dazu, Javas Grundphilosophie "Einmal schreiben, überall ausführen" zu verwirklichen. Wenn Sie den Quellcode direkt in die Maschinensprache konvertieren, lautet die kompilierte Maschinensprache Es wird "abhängig" von der Umgebung, in der es kompiliert wurde. Weil die JVM die Fähigkeit implementiert, Java-Bytecode in Maschinensprache zu konvertieren Solange Sie die JVM installieren, können Sie Java in jeder Umgebung ausführen. Mit anderen Worten: "Sobald Sie den Quellcode geschrieben haben, können Sie ihn auch in verschiedenen Umgebungen ausführen."

Übersicht über den Befehl javac

Das Kompilieren bei Ausführung von Javac ist wie folgt.

  1. Analysieren Sie die angegebene Klasse und suchen Sie nach abhängigen Typen
  2. Kompilieren Sie den entsprechenden Typ in der Suche

Das Wichtigste hier ist "1. Typensuche". Java benötigt alle Arten von Informationen, die die angegebene Klasse beim Kompilieren benötigt. Insbesondere sind die erforderlichen Typen wie folgt.

Beachten Sie die Klassen, die implizit vererbt und implementiert werden. Um beispielsweise die Klasse java.util.ArrayList zu kompilieren, erbt ArrayList Es erfordert auch Informationen zu Schnittstellen wie Serializable, Iterable , Collection , Die Informationen erscheinen nicht im Quellcode.

Suchreihenfolge

Das Typensuchziel enthält mehrere Bereiche, und die Reihenfolge, in der sie durchsucht werden, ist festgelegt. Die zu durchsuchenden Bereiche sind wie folgt. (In der Reihenfolge angeordnet, in der sie durchsucht werden)

--Bootstrap-Klasse Eine Gruppe von Klassen, die die Kern-API des JDK enthält (z. B. java.lang. *). Im Allgemeinen befindet es sich in `` `<JAVA_HOME> / lib```.

Die obige Suchreihenfolge lautet Gleiches gilt für Klassenlader, die zur Laufzeit Klasseninformationen in den Speicher laden. Weitere Informationen zum Klassenladeprogramm finden Sie unter Was ist ein Klassenladeprogramm.

Wenn Sie javac ausführen, wird die Suche in der oben angegebenen Reihenfolge durchgeführt Wenn derselbe Typ mehrmals erkannt wird, werden die Informationen in dem Bereich mit der höchsten Suchpriorität verwendet.

Verhalten für Suchergebnisse

Zum Zeitpunkt der Kompilierung hängen die durch die Typensuche gefundenen Dateien von der Situation ab Dies kann eine Klassendatei, eine Quelldatei oder beides sein. Die von javac durchgeführte Verarbeitung ist je nach Typ und Situation der gefundenen Datei in die folgenden drei unterteilt.

[Wenn nur die Klassendatei gefunden wird] Verwenden Sie die Klassendatei unverändert

[Wenn nur die Quelldatei gefunden wird] Kompilieren Sie die Quelldatei und verwenden Sie die generierte Klassendatei

[Wenn beide gefunden werden] ~ Wenn die Klassendatei älter als die Quelldatei ist ~ Kompilieren Sie die Quelldatei und verwenden Sie die zuletzt generierte Klassendatei ~ Anders als oben ~ Verwenden Sie die Klassendatei unverändert

Cross-Compile

Bei der Entwicklung verwende ich Java2 SDK, also ist Javac Java2 SDK Kompilieren Sie für Bootstrap-Klassen, jedoch mit JDK 1.4 anstelle von Java 2 SDK Möglicherweise möchten Sie auch die Bootstrap-Klasse verwenden.

In diesen Fällen ermöglicht die Option `-target 1.4``` 1.4 VM-kompatible Klassendateien. Verwenden Sie -bootclasspath``` und `` -extdirs```, um eine JDK 1.4-Bootstrap-Klasse zu erstellen Gibt an, für was kompiliert werden soll.

Auf diese Weise kann die Funktion über Versionen usw. kompiliert werden. Es heißt ** Cross-Compile **.

javac Befehlsoptionen

Jetzt, da Sie alle Begriffe zur Java-Kompilierung verstanden haben Werfen wir einen Blick auf die Optionen zum Vornehmen verschiedener Einstellungen und Spezifikationen.

Hauptoptionen

--- Codierung Geben Sie den Zeichencode der Quelldatei an. Standardmäßig Java-Plattformkonverter (Quellcode ↔︎ Java-Bytecode-Konvertierung) Verwenden Sie den Codierungssatz auf. --- Quellpfad Geben Sie den Speicherort der Quelldatei an. Standardmäßig wird der Benutzerklassenpfad angegeben. --- d Geben Sie den Speicherort der Klassendatei an. Standardmäßig wird der Benutzerklassenpfad angegeben. --- Klassenpfad (oder -cp) Geben Sie das Suchziel der Benutzerklasse an. Wenn mehrere Auswahlen getroffen werden, trennen Sie diese mit einem Semikolon (Windows) oder einem Doppelpunkt (Unix). --- Quelle Lassen Sie nur bestimmte JDK-Versionen des Quellcodes zu.

Debug-Optionen

Cross-Compilation-Optionen

--- Ziel Generiert eine Klassendatei, die auf der angegebenen VM-Version ausgeführt wird. Standardmäßig wird eine Klassendatei generiert, die mit der JDK5-VM kompatibel ist. Der Standardwert ist jedoch nur 1.4, wenn die Optionen unter -Quelle 1.4 verwendet werden. Die unterstützten Versionen von Javac sind: - 1.1
Generieren Sie eine Klassendatei, die auf einer VM mit JDK 1.1 oder höher ausgeführt werden soll. - 1.2
Generieren Sie eine Klassendatei, die auf VMs vor JDK 1.2 nicht funktioniert. - 1.3
Generieren Sie eine Klassendatei, die auf VMs vor JDK 1.3 nicht funktioniert. - 1.4
Generieren Sie eine Klassendatei, die auf VMs vor JDK 1.4 nicht funktioniert. - 1.5
Generieren Sie Klassendateien, die nur mit JDK 5-VMs kompatibel sind. - 5
Synonym für 1.5. --- Bootclasspath Cross-Compile für die angegebene Boot-Klasse. Wie der Benutzerklassenpfad Trennen Sie mehrere Einträge im Bootklassenpfad durch ein Semikolon oder einen Doppelpunkt. Der Pfad der Startklasse kann ein Verzeichnis, ein JAR-Archiv oder ein ZIP-Archiv sein.

Lauf

Die folgenden Informationen sind erforderlich, um UseCommons.java auszuführen.

--Klasse mit Hauptmethode (UseCommons.java)

Um die oben genannten Informationen zu sammeln, benötigt der Befehl javac die folgenden Informationen:

--Location of UseCommons, die auszuführende Klasse

Die spezifischen Befehle lauten wie folgt.

#Das aktuelle Verzeichnis ist/java-sample/src
$ javac -cp /java-sample/lib/commons-lang3-3.10.jar:/java-sample/src com/example/app/UseCommons.java

Das Folgende ist die Spezifikation des Klassenpfads.

#Geben Sie den Klassenpfad der JAR-Datei an(Geben Sie bis zur Datei an)
/java-sample/lib/commons-lang3-3.10.jar
#Geben Sie den Klassenpfad der Klassendatei an(Geben Sie nicht bis zur Datei an)
/java-sample/src
#Wie oben erwähnt, wenn mehrere Klassenpfade angegeben werden:(Für Windows;)Verbinden mit
-cp /java-sample/lib/commons-lang3-3.10.jar:/java-sample/src

Gibt die letzte auszuführende Klasse an.

#Im Beispiel wird es durch den relativen Pfad aus dem aktuellen Verzeichnis angegeben.
com/example/app/UseCommons.java

Unten sind die Ausführungsergebnisse. スクリーンショット 2020-05-25 21.23.45.png

Wenn Sie nachsehen, werden Sie sehen, dass eine xxx.class-Datei mit demselben Namen wie xxx.java erstellt wurde. Verwenden Sie für Klassen, die in UseCommons definiert sind, UseCommons $ CommonsHelper.class Eine Datei im Format `` `Klassenname $ innerer Klassenname.Klasse``` wird erstellt.

Andere Anwendungsfälle für den Befehl javac

Mehrere Dateien kompilieren

Sie können mehrere Dateien mit regulären Ausdrücken kompilieren. In diesem Fall der Klassenpfad zu der Klasse, die von der Zielklasse benötigt wird Alles muss eingestellt sein.

#Kompilieren Sie alle Klassen in mehreren Verzeichnissen
javac multiple/*.java
#Kompilieren Sie alle Klassen mit dem Namen ~ Target in mehreren Verzeichnissen
javac multiple/*Target.java

Separate Speicherorte für Quelldateien und Klassendateien

In den bisherigen Beispielen wird die Klassendatei also im selben Verzeichnis erstellt Das Erstellen einer JAR-Datei erfordert zusätzlichen Aufwand, und die Ordner sind nicht organisiert und schwer zu erkennen. Verwenden Sie in diesem Fall die Option -d zum Speichern der Klassendatei und -sourcepath zum Speichern der Quelldatei. Sie können das Speicherziel angeben.

#Bei Ausführung direkt unter src.Java-Datei ist direkt unter Klassen.Klassendatei wird gespeichert
javac -sourcepath src -d classes /src/com/example/app/Sample.java

Cross-Compile

Im folgenden Beispiel wird eine Plattform mit dem Java2 SDK als Voraussetzung vorausgesetzt. Wenn Sie den folgenden Befehl ausführen, handelt es sich nicht um die Java2-Plattform-API des Java2-SDK, sondern Es wird jetzt mit der Kern-API von JDK 1.4 kompiliert.

Ergänzung: Informationen zum Einstellungswert des Klassenpfads -boot -bootclasspath enthält Verzeichnisse, JAR-Dateien, ZIP-Dateien usw. Da dies angegeben werden kann, wird eine JAR-Datei, in der die Bootstrap-Klassen zusammen gespeichert sind, unabhängig gespeichert. Wenn Sie es erstellen, müssen Sie nicht mehr mehrere Einträge angeben.

# -target 1.4:JDK1.Generieren Sie eine Klassendatei, die mit 4 und höher kompatibel ist
# -bootclasspath <Pfad>:指定したPfadにあるブートストラップクラスを使用してコンパイルを行う
javac -target 1.4 -bootclasspath <Speicherort des Bootstrap-Klassenarchivs> Sample.java

Ergänzung: So überprüfen Sie den Speicherort der Bootstrap-Klasse Der Speicherort der Bootstrap-Klasse ist Sie wird in der Systemeigenschaft sun.boot.class.path festgelegt.

Befehlszeilenargumentdatei

Verwenden Sie für javac eine Datei mit dem Namen Befehlszeilenargumentdatei Es gibt einen Mechanismus zum Angeben mehrerer Klassen und mehrerer Optionen, der jedoch vollständig genutzt werden kann In Anbetracht der Kosten denke ich, dass es besser ist, das Build-Tool zu studieren, also werde ich es weglassen.

Zurück zur Hauptseite

Recommended Posts

Einführung in den Befehl javac
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in Ruby 2
Einführung in Micronaut 1 ~ Einführung ~
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in JAR-Dateien
Einführung in Ratpack (8) -Session
Einführung in die Bitarithmetik
Einführung in Ratpack (6) --Promise
Einführung in Ratpack (9) - Thymeleaf
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Einführung in Entwurfsmuster (Einführung)
Einführung in Ratpack (2) -Architektur
Einführung in den Lambda-Stil
Einführung in die Keycloak-Entwicklung
Einführung in Entwurfsmuster (Builder)
Einführung in Ratpack (5) --Json & Registry
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
(Punktinstallation) Einführung in Java8_Impression
Einführung in Entwurfsmuster (Composite)
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Designmuster (Fliegengewicht)
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
Einführung in Entwurfsmuster Prototyp
[Java] Einführung in die Stream-API
Einführung in Entwurfsmuster (Iterator)
Einführung in Spring Boot Teil 1
Einführung in Ratpack (1) - Was ist Ratpack?
Einführung in Entwurfsmuster (Strategie)
[Einführung in Janken (ähnliche) Spiele] Java
Einführung in Linux Container / Docker (Teil 1)
Einführung in die schnelle Übungsausgabe Kapitel 5
[Einführung in Java] Über Lambda-Ausdrücke
Einführung in Algorithmen mit Java-kumulativer Summe
[Einführung in Java] Informationen zur Stream-API
Einführung in die funktionale Programmierung (Java, Javascript)
OpenJDK 8 Java- und Javac-Befehlshilfe
Einführung in Algorithmen mit der Java-Shakutori-Methode
Einführung in Entwurfsmuster (Factory-Methode)
Einführung in Linux Container / Docker (Teil 2)