Java 11 Single File Quellcode

1. Einleitung

JDK 11, die Implementierung von Java SE 11, wurde im September 2018 veröffentlicht.

In diesem Tutorial werden wir die neue Java 11-Funktion zum Starten von Quellcode-Programmen für einzelne Dateien behandeln.

2. Vor Java 11

Ein Einzeldateiprogramm ist eines, bei dem das Programm in eine einzelne Quelldatei passt.

Vor Java 11 mussten wir selbst für ein Programm mit nur einer Datei einen zweistufigen Prozess ausführen, um das Programm auszuführen.

Wenn beispielsweise eine Datei namens HelloWorld.java eine Klasse namens HelloWorld mit einer main () -Methode enthält, müssen wir sie zuerst kompilieren:

$ javac HelloWorld.java

Dies würde eine Klassendatei erzeugen, die wir mit dem folgenden Befehl ausführen müssten:

$ java HelloWorld Hello Java 11!

Solche Programme sind Standard in den frühen Phasen des Lernens von Java oder beim Schreiben kleiner Hilfsprogramme. In diesem Zusammenhang ist es etwas zeremoniell, das Programm kompilieren zu müssen, bevor es ausgeführt wird.

Aber wäre es nicht großartig, stattdessen nur einen einstufigen Prozess zu haben? Java 11 versucht dies zu beheben, indem es uns ermöglicht, solche Programme direkt von der Quelle aus auszuführen.

3. Starten von Single-File-Quellcode-Programmen

Ab Java 11 können wir den folgenden Befehl verwenden, um ein Einzeldateiprogramm auszuführen:

$ java HelloWorld.java Hello Java 11!

Beachten Sie, wie wir den Namen der Java-Quellcodedatei und nicht die Java-Klasse an den Befehl java übergeben haben .

Die JVM kompiliert die Quelldatei in den Speicher und führt dann die erste öffentliche main () -Methode aus, die sie findet.

Wir erhalten Kompilierungsfehler, wenn die Quelldatei Fehler enthält. Andernfalls wird sie so ausgeführt, als hätten wir sie bereits kompiliert.

4. Befehlszeilenoptionen

Der Java-Launcher hat einen neuen Quelldateimodus eingeführt , um diese Funktion zu unterstützen. Der Quelldateimodus ist aktiviert, wenn eine der beiden folgenden Bedingungen erfüllt ist:

  1. Das erste Element in der Befehlszeile, gefolgt von den JVM-Optionen, ist ein Dateiname mit der Erweiterung .java
  2. Die Befehlszeile enthält die Option –source version

Wenn die Datei nicht den Standard-Namenskonventionen für Java-Quelldateien entspricht, müssen Sie die Option –source verwenden . Wir werden im nächsten Abschnitt mehr über solche Dateien sprechen.

Alle Argumente, die in der ursprünglichen Befehlszeile nach dem Namen der Quelldatei stehen, werden bei ihrer Ausführung an die kompilierte Klasse übergeben.

Zum Beispiel haben wir eine Datei namens Addition.java , die eine Addition- Klasse enthält . Diese Klasse enthält eine main () -Methode, die die Summe ihrer Argumente berechnet:

$ java Addition.java 1 2 3

Außerdem können wir Optionen wie –class-path vor dem Dateinamen übergeben:

$ java --class-path=/some-path Addition.java 1 2 3

Jetzt wird eine Fehlermeldung angezeigt, wenn sich im Klassenpfad der Anwendung eine Klasse mit demselben Namen befindet wie die Klasse, die wir ausführen .

Nehmen wir zum Beispiel an, wir haben irgendwann in der Entwicklung die in unserem aktuellen Arbeitsverzeichnis vorhandene Datei mit javac kompiliert :

$ javac HelloWorld.java

Wir haben jetzt sowohl HelloWorld.java als auch HelloWorld.class im aktuellen Arbeitsverzeichnis:

$ ls HelloWorld.class HelloWorld.java

Wenn wir jedoch versuchen, den Quelldateimodus zu verwenden, wird eine Fehlermeldung angezeigt:

$ java HelloWorld.java error: class found on application class path: HelloWorld

5. Shebang-Dateien

In von Unix abgeleiteten Systemen wie macOS und Linux ist es üblich, das "#!" Anweisung zum Ausführen einer ausführbaren Skriptdatei.

Beispielsweise beginnt ein Shell-Skript normalerweise mit:

#!/bin/sh

Wir können dann das Skript ausführen:

$ ./some_script

Solche Dateien werden als "Shebang-Dateien" bezeichnet.

Wir können jetzt Java-Einzeldateiprogramme mit demselben Mechanismus ausführen.

Wenn wir am Anfang einer Datei Folgendes hinzufügen:

#!/path/to/java --source version

Fügen wir beispielsweise den folgenden Code in eine Datei mit dem Namen add ein :

#!/usr/local/bin/java --source 11 import java.util.Arrays; public class Addition { public static void main(String[] args) { Integer sum = Arrays.stream(args) .mapToInt(Integer::parseInt) .sum(); System.out.println(sum); } }

Und markieren Sie die Datei als ausführbar:

$ chmod +x add

Dann können wir die Datei wie ein Skript ausführen:

$ ./add 1 2 3 6

Wir können den Launcher auch explizit verwenden, um die Shebang-Datei aufzurufen:

$ java --source 11 add 1 2 3 6

Die Option –source ist auch dann erforderlich, wenn sie bereits in der Datei vorhanden ist. Der Shebang in der Datei wird ignoriert und als normale Java-Datei ohne die Erweiterung .java behandelt .

Allerdings können wir nicht behandeln .java - Datei als shebang Datei, auch wenn es ein gültiges shebang enthält. Daher führt Folgendes zu einem Fehler:

$ ./Addition.java ./Addition.java:1: error: illegal character: '#' #!/usr/local/bin/java --source 11 ^

Eine letzte Sache, die Sie bei Shebang-Dateien beachten sollten, ist, dass die Direktive die Datei plattformabhängig macht. Die Datei kann nicht auf Plattformen wie Windows verwendet werden, die sie nicht nativ unterstützen.

6. Fazit

In diesem Artikel haben wir die neue Quellcode-Funktion für einzelne Dateien gesehen, die in Java 11 eingeführt wurde.

Wie üblich finden Sie Code-Schnipsel auf GitHub.