Java ** .class-Dateien mit Javac kompilieren

1. Überblick

In diesem Lernprogramm wird das Tool javac vorgestellt und beschrieben, wie Java-Quelldateien in Klassendateien kompiliert werden.

Wir werden mit einer kurzen Beschreibung des Befehls javac beginnen und dann das Werkzeug genauer untersuchen, indem Sie die verschiedenen Optionen betrachten.

2. Der javac Befehl

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

javac[options][source-files]----

Dabei bezeichnet __[Optionen]__ die Optionen, die Operationen des Werkzeugs steuern, und __[Quelldateien]__ zeigt eine oder mehrere zu kompilierende Quelldateien an.

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 die Quelldateien in einer Verzeichnishierarchie angeordnet werden sollten, die den vollständig qualifizierten Namen der darin enthaltenen Typen entspricht ** .

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 Cross-Compilierungs-Optionen werden für den weniger gebräuchlichen Anwendungsfall des Kompilierens von Typdefinitionen mit einer JVM-Implementierung verwendet, die sich von der Umgebung des Compilers unterscheidet, und werden nicht angesprochen.

===  **  3. Typdefinition **

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

[source,java,gutter:,true]

public class Data { List<String> textList = new ArrayList();

public void addText(String text) {
    textList.add(text);
}
    public List getTextList() {
        return this.textList;
    }
}
Der Quellcode wird in die Datei __com/baeldung/javac/Data.java__ gestellt.

Beachten Sie, dass wir in diesem Artikel **  nix-Dateiseparatoren verwenden. Auf Windows-Computern müssen wir den Backslash ("__ \" __) anstelle des Schrägstrichs ("__/") verwenden.

===  **  4. Standardoptionen **

Eine der am häufigsten verwendeten Standardoptionen des Befehls __javac__ ist __-d__. **  Das Zielverzeichnis für generierte Klassendateien **  wird angegeben.

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:

[source,bash,gutter:,true]

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 auf einigen Systemen __javac__ das Zielverzeichnis nicht automatisch erstellt, in diesem Fall __javac-target__. Daher müssen wir dies möglicherweise manuell tun.

Hier sind ein paar andere häufig verwendete Optionen:

**  **  __- cp__ (oder __-classpath__, __ – class-path__) - **  gibt an, wo die Typen sind

erforderlich, um unsere Quelldateien zu kompilieren. Wenn diese Option fehlt und die Umgebungsvariable __CLASSPATH__ nicht festgelegt ist, wird stattdessen das aktuelle Arbeitsverzeichnis verwendet (wie im obigen Beispiel).

**  **  __- p__ (oder __ – module-path__) - **  gibt den Ort an, wo dies erforderlich ist

Anwendungsmodule. Diese Option gilt nur für Java 9 und höher. Eine Anleitung zum Java 9-Modulsystem finden Sie unter link:/project-jigsaw-java-modularity[dieses Tutorial].

Wenn wir wissen möchten, was während eines Kompilierungsvorgangs abläuft, z.

welche Klassen geladen und welche kompiliert werden, können wir die Option __-verbose__ anwenden.

Die letzte Standardoption, die wir behandeln, 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 die in einer solchen Argumentdatei enthaltenen Argumente voneinander zu trennen.

Nehmen wir an, wir haben zwei Dateien mit dem Namen __options__ und __types__ im Verzeichnis __javac-args__ mit folgendem Inhalt:

Die __options__-Datei:

[source,text,gutter:,true]

-d javac-target -verbose

Die __types__-Datei:

[source,text,gutter:,true]

com/baeldung/javac/Data.java

Wir können den __Data__-Typ wie zuvor mit auf der Konsole gedruckten Detailmeldungen kompilieren, indem Sie diesen Befehl ausführen:

[source,bash,gutter:,true]

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

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

Angenommen, es gibt eine Datei mit dem Namen __arguments__ im Verzeichnis __javac-args__:

[source,text,gutter:,true]

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

Lassen Sie uns diese Datei an __javac__ übergeben, um dasselbe Ergebnis zu erzielen wie bei den beiden separaten Dateien vor ____: ____

[source,bash,gutter:,true]

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 Standardoptionen für __javac__ finden Sie unter https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9____STANDARDOPTIONSFORJAVAC-7D3D9CC2.

===  **  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 der Zukunft geändert werden können. Daher gehen wir diese Optionen nicht im Detail an.

Es gibt jedoch eine sehr nützliche und erwähnenswerte Option, __-Xlint__. Eine vollständige Beschreibung der anderen __javac__-Zusatzoptionen finden Sie unter https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8EBC7-BCC2C7-BCC2C7__BCC2C7____CON__NONSTANDARDOPTIONSFORJAVAC-7D3AAAAA.

**  Mit der Option __-Xlint__ können Warnungen während der Kompilierung aktiviert werden ** .

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 Rohtypen

**  **  __unchecked –__ **  warnt vor ungeprüften Operationen

**  **  __static –__ **  warnt vor dem Zugriff eines statischen Members von

Instanzmitglied
**  **  __cast –__ **  warnt vor unnötigen Besetzungen

**  **  __serial –__ **  warnt vor serialisierbaren Klassen, die keine haben

__serialversionUID__
**  **  __fallthrough –__ **  warnt vor dem Durchfallen in einem __switch__

Aussage

Erstellen Sie nun eine Datei mit dem Namen __xlint-ops__ im Verzeichnis __javac-args__ mit folgendem Inhalt:

[source,text,gutter:,true]

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

Wenn Sie diesen Befehl ausführen:

[source,bash,gutter:,true]

javac @javac-args/xlint-ops

Wir sollten die Warnungen __rawtypes__ und __unchecked__ sehen:

[source,text,gutter:,false]

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

===  **  6. Fazit**

In diesem Lernprogramm wurde das __javac__-Tool beschrieben. Es zeigt, wie Sie den typischen Kompilierungsprozess mithilfe von Optionen verwalten können.

In der Regel kompilieren wir ein Programm mithilfe einer IDE oder eines Build-Tools, anstatt __javac__ direkt zu verwenden. Ein solides Verständnis dieses Tools ermöglicht es uns jedoch, die Kompilierung in fortgeschrittenen Anwendungsfällen anzupassen.

Den Quellcode für dieses Tutorial finden Sie wie immer unter https://github.com/eugenp/tutorials/tree/master/core-java/[over auf GitHub].