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:

  1. Der Quelldateiname "HelloWorld.java" muss mit dem Klassennamen in der Quelldatei übereinstimmen. HelloWorld ist HelloWorld . Wenn sie nicht übereinstimmen, wird ein Kompilierungsfehler angezeigt.
  2. Der Bytecode-Dateiname "HelloWorld.class" entspricht dem Klassennamen. Wenn Sie die "HelloWorld.class" umbenennen, erhalten Sie eine Fehlermeldung, wenn Sie versuchen, sie auszuführen.
  3. 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:

  1. Die Verzeichnisstruktur muss mit der Paketnamenstruktur übereinstimmen.
  2. Wenn Sie die Klasse ausführen, muss der vollständige Klassenname angegeben werden. dh "com.example.HelloWorld" nicht "HelloWorld".
  3. 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow