Java Language
Java Compiler - "Javac"
Suche…
Bemerkungen
Der Befehl javac
wird zum Kompilieren von Java-Quelldateien zu Bytecode-Dateien verwendet. Bytecode-Dateien sind plattformunabhängig. Dies bedeutet, dass Sie Ihren Code auf einer Art von Hardware und Betriebssystem kompilieren und dann auf einer anderen Plattform ausführen können, die Java unterstützt.
Der Befehl javac
ist in den JDK-Distributionen (Java Development Kit) enthalten.
Der Java-Compiler und der Rest der Standard-Java-Toolchain unterliegen folgenden Einschränkungen für den Code:
- Der Quellcode wird in Dateien mit dem Suffix ".java" gespeichert.
- Bytecodes werden in Dateien mit dem Suffix ".class" gespeichert.
- Bei Quell- und Bytecode-Dateien im Dateisystem müssen die Dateipfadnamen die Paket- und Klassennamen angeben.
Hinweis: Der javac
Compiler sollte nicht mit dem Just In Time-Compiler (JIT) verwechselt werden, der Bytecodes in nativen Code kompiliert.
Der Befehl 'Javac' - Erste Schritte
Einfaches Beispiel
Angenommen, die "HelloWorld.java" enthält die folgende Java-Quelle:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
(Eine Erläuterung des obigen Codes finden Sie unter Erste Schritte mit Java Language .)
Wir können die obige Datei mit diesem Befehl kompilieren:
$ javac HelloWorld.java
Dies erzeugt eine Datei namens "HelloWorld.class", die wir dann wie folgt ausführen können:
$ java HelloWorld
Hello world!
Die wichtigsten Punkte aus diesem Beispiel sind:
- Der Quelldateiname "HelloWorld.java" muss mit dem Klassennamen in der Quelldatei übereinstimmen.
HelloWorld
istHelloWorld
. Wenn sie nicht übereinstimmen, wird ein Kompilierungsfehler angezeigt. - Der Bytecode-Dateiname "HelloWorld.class" entspricht dem Klassennamen. Wenn Sie die "HelloWorld.class" umbenennen, erhalten Sie eine Fehlermeldung, wenn Sie versuchen, sie auszuführen.
- Wenn Sie eine Java-Anwendung mit
java
ausführen, geben Sie den Klassennamen NICHT den Bytecode-Dateinamen an.
Beispiel mit Paketen
Die meisten praktischen Java-Codes verwenden Pakete, um den Namespace für Klassen zu organisieren und das Risiko einer versehentlichen Klassennamenkollision zu reduzieren.
Wenn wir das erklären wollte HelloWorld
Klasse in einem Paket Anruf com.example
, die „HelloWorld.java“ würde folgende Komponenten enthalten Java Quelle:
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Diese Quellcodedatei muss in einer Verzeichnisstruktur gespeichert werden, deren Struktur der Paketnamen entspricht.
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
Wir können die obige Datei mit diesem Befehl kompilieren:
$ javac com/example/HelloWorld.java
Dadurch wird eine Datei mit dem Namen "com / example / HelloWorld.class" erzeugt. dh nach dem Kompilieren sollte die Dateistruktur so aussehen:
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
----HelloWorld.class
Wir können die Anwendung dann wie folgt ausführen:
$ java com.example.HelloWorld
Hello world!
Zusätzliche Punkte aus diesem Beispiel sind zu beachten:
- Die Verzeichnisstruktur muss mit der Paketnamenstruktur übereinstimmen.
- Wenn Sie die Klasse ausführen, muss der vollständige Klassenname angegeben werden. dh "com.example.HelloWorld" nicht "HelloWorld".
- Sie müssen Java-Code nicht aus dem aktuellen Verzeichnis kompilieren und ausführen. Wir machen es hier nur zur Veranschaulichung.
Mehrere Dateien auf einmal mit 'javac' kompilieren.
Wenn Ihre Anwendung aus mehreren Quellcodedateien besteht (und die meisten tun es!), Können Sie sie einzeln kompilieren. Alternativ können Sie mehrere Dateien gleichzeitig kompilieren, indem Sie die Pfadnamen auflisten:
$ javac Foo.java Bar.java
oder verwenden Sie die Dateinamen-Platzhalterfunktionalität Ihrer Befehls-Shell ....
$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell
Dadurch werden alle Java-Quelldateien im aktuellen Verzeichnis, im Verzeichnis "com / example" und rekursiv in untergeordneten Verzeichnissen kompiliert. Eine dritte Alternative besteht darin, eine Liste von Quelldateinamen (und Compileroptionen) als Datei bereitzustellen. Zum Beispiel:
$ javac @sourcefiles
wo die sourcefiles
enthält:
Foo.java
Bar.java
com/example/HelloWorld.java
Hinweis: Das Kompilieren von Code eignet sich für kleine Ein-Personen-Projekte und einmalige Programme. Darüber hinaus ist es ratsam, ein Java-Build-Tool auszuwählen und zu verwenden. Alternativ verwenden die meisten Programmierer eine Java IDE (z. B. NetBeans , Eclipse , IntelliJ IDEA ), die einen eingebetteten Compiler und die inkrementelle Erstellung von "Projekten" bietet.
Häufig verwendete "Javac" -Optionen
Hier sind ein paar Optionen für den Befehl javac
, die für Sie wahrscheinlich nützlich sind
- Die Option
-d
legt ein Zielverzeichnis für das Schreiben der ".class" -Dateien fest. - Die Option
-sourcepath
legt einen Quellcode-Suchpfad fest. - Die Option
-cp
oder-classpath
legt den Suchpfad zum Suchen externer und zuvor kompilierter Klassen fest. Weitere Informationen zum Klassenpfad und seiner Angabe finden Sie im Thema Der Klassenpfad. - Die Option
-version
die Versionsinformationen des Compilers aus.
Eine vollständigere Liste der Compileroptionen wird in einem separaten Beispiel beschrieben.
Verweise
Die endgültige Referenz für den Befehl javac
ist die Oracle-Handbuchseite für javac
.
Kompilieren für eine andere Java-Version
Die Java-Programmiersprache (und ihre Laufzeit) hat seit ihrer Veröffentlichung seit ihrer Veröffentlichung zahlreiche Änderungen erfahren. Diese Änderungen umfassen:
- Änderungen in der Syntax und Semantik der Java-Programmiersprache
- Änderungen in den APIs, die von den Java-Standardklassenbibliotheken bereitgestellt werden.
- Änderungen im Java-Befehlssatz (Bytecode) und im Format der Klassendatei.
Mit wenigen Ausnahmen (z. B. das Schlüsselwort enum
, Änderungen an einigen "internen" Klassen usw.) sind diese Änderungen abwärtskompatibel.
- Ein Java-Programm, das mit einer älteren Version der Java-Toolchain kompiliert wurde, wird auf einer neueren Version der Java-Plattform ohne Neukompilierung ausgeführt.
- Ein Java-Programm, das in einer älteren Java-Version geschrieben wurde, wird erfolgreich mit einem neuen Java-Compiler kompiliert.
Kompilieren von altem Java mit einem neueren Compiler
Wenn Sie älteren Java-Code auf einer neueren Java-Plattform (neu) kompilieren müssen, um auf der neueren Plattform ausgeführt zu werden, müssen Sie im Allgemeinen keine speziellen Kompilierungsflags angeben. In einigen Fällen (z. B. wenn Sie enum
als Bezeichner verwendet haben), können Sie die Option -source
, um die neue Syntax zu deaktivieren. Zum Beispiel die folgende Klasse gegeben:
public class OldSyntax {
private static int enum; // invalid in Java 5 or later
}
Zum Kompilieren der Klasse mit einem Java 5-Compiler (oder höher) ist Folgendes erforderlich:
$ javac -source 1.4 OldSyntax.java
Kompilieren für eine ältere Ausführungsplattform
Wenn Sie Java für die Ausführung auf älteren Java-Plattformen kompilieren müssen, installieren Sie am einfachsten ein JDK für die älteste Version, die Sie unterstützen müssen, und verwenden Sie den Compiler dieses JDK in Ihren Builds.
Sie können auch mit einem neueren Java-Compiler kompilieren, dies ist jedoch kompliziert. Zunächst einige wichtige Voraussetzungen, die erfüllt sein müssen:
- Der Code, den Sie kompilieren, darf keine Java-Sprachkonstrukte verwenden, die in der Java-Version, auf die Sie abzielen, nicht verfügbar waren.
- Der Code darf nicht von Standard-Java-Klassen, -Feldern, -Methoden usw. abhängig sein, die auf älteren Plattformen nicht verfügbar waren.
- Bibliotheken von Drittanbietern, von denen der Code abhängig ist, müssen auch für die ältere Plattform erstellt werden und zur Kompilierungszeit und zur Laufzeit verfügbar sein.
Wenn die Voraussetzungen erfüllt sind, können Sie den Code für eine ältere Plattform mit der Option -target
kompilieren. Zum Beispiel,
$ javac -target 1.4 SomeClass.java
kompiliert die obige Klasse, um Bytecodes zu erzeugen, die mit JVM von Java 1.4 oder höher kompatibel sind. (Tatsächlich impliziert die Option -source
ein kompatibles -target
, sodass javac -source 1.4 ...
die gleiche Wirkung hätte. Die Beziehung zwischen -source
und -target
ist in der Oracle-Dokumentation beschrieben.)
Wenn Sie jedoch -target
oder -source
, kompilieren Sie immer noch mit den Standardklassenbibliotheken, die vom JDK des Compilers bereitgestellt werden. Wenn Sie nicht vorsichtig sind, können Sie Klassen mit der korrekten Bytecode-Version erhalten, jedoch mit Abhängigkeiten von nicht verfügbaren APIs. Die Lösung besteht darin, die Option -bootclasspath
zu verwenden. Zum Beispiel:
$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java
wird mit einem alternativen Satz von Laufzeitbibliotheken kompiliert. Wenn die zu kompilierende Klasse (versehentlich) von neueren Bibliotheken abhängig ist, werden Kompilierungsfehler angezeigt.