Kompilieren von Java * .class-Dateien mit javac

1. Übersicht

In diesem Tutorial wird das Javac- Tool vorgestellt und beschrieben, wie Sie damit Java-Quelldateien in Klassendateien kompilieren.

Wir beginnen mit einer kurzen Beschreibung des Befehls javac und untersuchen das Tool anhand der verschiedenen Optionen.

2. Der Javac- Befehl

Wir können Optionen und Quelldateien angeben, wenn wir das Javac- Tool ausführen :

javac [options] [source-files]

Wobei [Optionen] die Optionen bezeichnet, die den Betrieb des Tools steuern, und [Quelldateien] eine oder mehrere zu kompilierende Quelldateien angibt.

Alle Optionen sind in der Tat völlig optional. Quelldateien können direkt als Argumente für den Befehl javac angegeben oder in einer referenzierten Argumentdatei gespeichert werden, wie später beschrieben wird. Beachten Sie, dass Quelldateien in einer Verzeichnishierarchie angeordnet sein sollten, die den vollständig qualifizierten Namen der darin enthaltenen Typen entspricht .

Die Optionen von Javac werden in drei Gruppen eingeteilt: Standard, Cross-Compilation und Extra. In diesem Artikel konzentrieren wir uns auf die Standard- und Zusatzoptionen.

Die kompilierungsübergreifenden Optionen werden für den selteneren Anwendungsfall des Kompilierens von Typdefinitionen für eine JVM-Implementierung verwendet, die sich von der Compilerumgebung unterscheidet, und werden nicht behandelt.

3. Typdefinition

Beginnen wir mit der Einführung der Klasse, mit der wir die Javac- Optionen demonstrieren werden :

public class Data { List textList = new ArrayList(); public void addText(String text) { textList.add(text); } public List getTextList() { return this.textList; } }

Der Quellcode befindet sich in der Datei com / baeldung / javac / Data.java .

Beachten Sie, dass wir in diesem Artikel * nix-Dateitrennzeichen verwenden. Auf Windows-Computern müssen wir den Backslash (' \' ) anstelle des Forward Slash (' /' ) verwenden.

4. Standardoptionen

Eine der am häufigsten verwendeten Standardoptionen des Befehls javac ist -d , wobei das Zielverzeichnis für generierte Klassendateien angegeben wird . Wenn ein Typ nicht Teil des Standardpakets ist, wird eine Verzeichnisstruktur erstellt, die den Namen des Pakets widerspiegelt, um die Klassendatei dieses Typs beizubehalten.

Führen Sie den folgenden Befehl in dem Verzeichnis aus, das die im vorherigen Abschnitt angegebene Struktur enthält:

javac -d javac-target com/baeldung/javac/Data.java

Der Javac- Compiler generiert die Klassendatei javac-target / com / baeldung / javac / Data.class . Beachten Sie, dass javac auf einigen Systemen das Zielverzeichnis, in diesem Fall javac-target , nicht automatisch erstellt . Daher müssen wir dies möglicherweise manuell tun.

Hier sind einige andere häufig verwendete Optionen:

  • -cp (oder -classpath , –class-path ) - gibt an, wo sich die zum Kompilieren unserer Quelldateien erforderlichen Typen befinden. Wenn diese Option fehlt und dieUmgebungsvariable CLASSPATH nicht festgelegt ist, wird stattdessen das aktuelle Arbeitsverzeichnis verwendet (wie im obigen Beispiel).
  • -p (oder –module-path ) - gibt den Speicherort der erforderlichen Anwendungsmodule an. Diese Option gilt nur für Java 9 und höher. In diesem Lernprogramm finden Sie eine Anleitung zum Java 9-Modulsystem.

Wenn wir wissen möchten, was während eines Kompilierungsprozesses vor sich geht, z. B. welche Klassen geladen und welche kompiliert werden, können wir die Option -verbose anwenden .

Die letzte Standardoption, die wir behandeln werden, ist die Argumentdatei. Anstatt Argumente direkt an das Javac- Tool zu übergeben, können wir sie in Argumentdateien speichern . Die Namen dieser Dateien, denen das Zeichen '@ ' vorangestellt ist , werden dann als Befehlsargumente verwendet.

Wenn der Befehl javac auf ein Argument stößt, das mit '@ ' beginnt , interpretiert er die folgenden Zeichen als Pfad zu einer Datei und erweitert den Inhalt der Datei in eine Argumentliste. Leerzeichen und Zeilenumbrüche können verwendet werden, um Argumente zu trennen, die in einer solchen Argumentdatei enthalten sind.

Nehmen wir an, wir haben zwei Dateien mit dem Namen options und types im Verzeichnis javac-args mit folgendem Inhalt:

Die Optionsdatei :

-d javac-target -verbose

Die Typen - Datei:

com/baeldung/javac/Data.java

Wir können den Datentyp wie zuvor mit Detailmeldungen kompilieren, die auf der Konsole gedruckt werden, indem wir diesen Befehl ausführen:

javac @javac-args/options @javac-args/types

Anstatt Argumente in separaten Dateien zu speichern , können wir sie auch alle in einer einzigen Datei speichern .

Angenommen, im Verzeichnis javac-args befindet sich eine Datei mit dem Namen Argumente :

-d javac-target -verbose com/baeldung/javac/Data.java

Lassen Sie uns diese Datei an javac weiterleiten , um das gleiche Ergebnis wie mit den beiden vorherigen Dateien zu erzielen :

javac @javac-args/arguments

Beachten Sie, dass die Optionen, die wir in diesem Abschnitt durchlaufen haben, nur die häufigsten sind. Eine vollständige Liste der Standard- Javac- Optionen finden Sie in dieser Referenz.

5. Zusätzliche Optionen

Zusätzliche Optionen von javac sind nicht standardmäßige Optionen, die für die aktuelle Compiler-Implementierung spezifisch sind und in Zukunft geändert werden können. Daher werden wir diese Optionen nicht im Detail behandeln.

Es gibt jedoch eine Option, die sehr nützlich und erwähnenswert ist: -Xlint . Eine vollständige Beschreibung der anderen zusätzlichen Javac- Optionen finden Sie unter diesem Link.

Mit der Option -Xlint können wir Warnungen während der Kompilierung aktivieren . Es gibt zwei Möglichkeiten, diese Option in der Befehlszeile anzugeben:

  • -Xlint - löst alle empfohlenen Warnungen aus
  • -Xlint: key [, key] * - aktiviert bestimmte Warnungen

Hier sind einige der handlichsten -Xlint- Tasten:

  • rawtypes - warnt vor der Verwendung von raw-Typen
  • nicht markiert - warnt vor nicht aktivierten Vorgängen
  • static - warnt vor dem Zugriff eines Instanzmitglieds auf ein statisches Mitglied
  • cast - warnt vor unnötigen Casts
  • serial - warnt vor serialisierbaren Klassen ohne serialversionUID
  • fallthrough - warnt vor dem Durchfallen in einer switch- Anweisung

Erstellen Sie nun im Verzeichnis javac-args eine Datei mit dem Namen xlint-ops mit folgendem Inhalt:

-d javac-target -Xlint:rawtypes,unchecked com/baeldung/javac/Data.java

Wenn Sie diesen Befehl ausführen:

javac @javac-args/xlint-ops

Wir sollten die Rohtypen und ungeprüften Warnungen sehen:

com/baeldung/javac/Data.java:7: warning: [rawtypes] found raw type: ArrayList List textList = new ArrayList(); ^ missing type arguments for generic class ArrayList where E is a type-variable: E extends Object declared in class ArrayList com/baeldung/javac/Data.java:7: warning: [unchecked] unchecked conversion List textList = new ArrayList(); ^ required: List found: ArrayList ...

6. Fazit

In diesem Tutorial wurde das Javac- Tool beschrieben und gezeigt, wie Optionen zum Verwalten des typischen Kompilierungsprozesses verwendet werden.

In der Realität kompilieren wir ein Programm normalerweise mit einer IDE oder einem Build-Tool, anstatt uns direkt auf Javac zu verlassen . Ein solides Verständnis dieses Tools ermöglicht es uns jedoch, die Kompilierung in fortgeschrittenen Anwendungsfällen anzupassen.

Wie immer finden Sie den Quellcode für dieses Tutorial auf GitHub.