Java 11 kurz angetestet

28.09.2018

Da diese Woche Java 11 erschienen ist (wie kürzlich hier berichtet), konnte ich es nicht lassen, ein klein wenig damit herumzuspielen.

Insbesondere war ich neugierig auf JEP-330, also der Möglichkeit, Java-Dateien direkt auszuführen zu können, ohne sie vorher kompilieren zu müssen. Voraussetzung ist, dass sich das komplette Programm innerhalb einer einzigen Java-Datei befindet.

Da ich das neue JDK nicht extra auf meinem Windows-Rechner installieren wollte, und außerdem die „Shebang“-Funktionalität für UNIX/Linux-Systeme testen wollte, habe ich kurzerhand einen Docker-Container mit OpenJDK 11 gestartet:

C:\Temp> docker run -it --name java11 openjdk:11 bash

Anschließend habe ich die folgende Datei namens Hello.java erstellt:

import java.util.stream.Stream;

class HelloJava11 {

    public static void main(String[] args) {
        print("Hello", "Java", "11");
    }

    private static void print(String... messages) {
        Stream.of(messages).forEach(
           (var msg) -> System.out.print(msg + " ")  
        );
        System.out.println();
    }
}

Anmerkungen:

  • Die Klasse heißt HelloJava11, im Unterschied zum Dateinamen Hello.java.
  • Die Klasse ist nicht public.
  • In Zeile 11 verwende ich ein weiteres neues Feature von Java 11, und zwar var in der Variablendeklaration eines Lambdas (JEP-323).

Diese Datei habe ich in den Dockercontainer kopiert:

C:\Temp> docker cp Hello.java java11:/

Im Anschluss konnte ich die Datei direkt im Dockercontainer ausführen:

root@427db092a9d9:/# java Hello.java
Hello Java 11

Und voilà, es hat geklappt, der String „Hello Java 11“ wurde ausgegeben. Trotz abweichendem Dateinamen und nichtöffentlicher Klasse!

Beim Anzeigen der Dateien im Container mit ls fällt auf, dass keine .class-Datei angelegt worden ist. Das bedeutet, dass die Klasse lediglich im Speicher kompiliert und ausgeführt wurde.

Nun noch ein kurzer Test der „Shebang“-Funktionalität. Dazu erstellte ich die folgende Shell-Scriptdatei namens hello_java.sh , die unter der „Shebang“-Zeile (Zeile 1) dasselbe Programm beinhaltet:

#!/usr/bin/java --source 11

import java.util.stream.Stream;

class HelloJava11 {

    public static void main(String[] args) {
        print("Hello", "Java", "11");
    }

    private static void print(String... messages) {
        Stream.of(messages).forEach( (var msg) -> System.out.print(msg + " ")  );
	System.out.println();
    }
}

Datei in den Docker-Container kopieren…

C:\Temp> docker cp hello_java.sh java11:/

… und innerhalb des Containers starten:

root@427db092a9d9:/# ./hello_java.sh
Hello Java 11

Auch das hat funktioniert, wie man an der Ausgabe sieht.

So kann man recht schnell ein Java-Programm ohne den Zwischenschritt des Kompilierens zum Laufen bringen, was vor allem Anfängern den Einstieg erleichtern dürfte.

Oder man „scriptet“ mal kurz Funktionalität in der Sprache die man am besten beherrscht, sollte dies zufüllig Java sein ;-) Wobei „scriptet“ bewusst in Anführungszeichen steht, denn die Datei wird nicht wie in herkömmlichen Skriptsprachen interpretiert, sondern im Hintergrund ins .class-Format kompiliert, das letztendlich von der JVM ausgeführt wird.

 

 

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*