Wie kann man die Javaversion ermitteln?v.10

Seit Java 10 hat Oracle ein neues Java-Versionssystem eingeführt. Der Artikel erläutert den Aufbau und wie die Version zur Laufzeit ermittelt werden kann.

Die auf einem System aktive Java Laufzeitumgebung lässt sich am einfachsten durch Eingabe von 'java -version' auf der Kommandozeile ermitteln:

Kommandozeile mit Java Versionsangabe

Wie kann dies jedoch zur Laufzeit eines Javaprogramms erfolgen? Hierzu existiert seit Java 9 die Klasse Runtime.Version, mit deren Methoden die Versionsangabe bzw. deren einzelne Teile ausgelesen und verglichen werden können. Hierzu muss zunächst ein Blick auf den Aufbau des Versions-Strings geworfen werden.

Aufbau der Versionsangabe

Eine Versionsangabe besteht aus einer Versionsnummer, die aus durch Punkte voneinander getrennten ganzzahligen, vorzeichenlosen Elementen besteht, ggf. gefolgt von optionalen Angaben. Oracle unterscheidet vier von links nach rechts hierarchisch angeordnete Versionsstufen und der ggf. schließenden optionalen Angabe:

Feature
Der erste Zähler bezeichnet das Feature der Version. Es kann Hauptänderungen aller Art umfassen. Neue Features erscheinen jährlich alle sechs Monate im März und September.
Interim
Die Interim-Nummer verweist auf Ausgaben von Bugfixes und Weiterentwicklungen, aber ohne Änderungen an der Standard-API.
Update
Die Update-Angabe verweist auf Sicherheitsupdates oder Bugfixes neuerer Features.
Patch
Patches sind reserviert für Notfall-Ausgaben kritischer Sicherheitsupdates.
optionale Angaben
Sie sind reserviert für Angaben zu plattformspezifischen Implementierungen, build-Nummern, Vorabversionsangaben und z.B. auch der Angabe zu long-term-support (LTS) Ausgaben, die alle drei Jahre erscheinen.

Alle fünf Bestandteile der Versionsangabe können getrennt ausgelesen werden. Hierzu stehen entsprechend benannte Methoden der Klasse Runtime.Version bereit. Ein Objekt dieser Klasse kann durch die Methode version() der Klasse Runtime erzeugt werden.
Die Methode optional() zum Auslesen der optionalen Angaben liefert hierbei ein Objekt der Klasse Optional, das gestreamt werden kann.

public class JavaVersionBsp {

    public static void main(String[] args) {
    	printVersion();
    }
    	
    private static void printVersion() {
    	Runtime.Version version = Runtime.version();
    	System.out.println("Version: " + version.toString());
    	
    	int feature = version.feature();
    	int interim = version.interim();
    	int update = version.update();
    	int patch = version.patch();
    	int build = version.build().get();
    	System.out.printf("feature: %s%ninterim: %s%nupdate: %s%npatch: %s%nbuild: %s%n", feature,
    			interim, update, patch, build);
    	version.optional().stream().forEach(System.out::println);
    }
}

Ausgabe bei Verwendung von Version 11:

Version: 11.0.9+7-LTS
feature: 11
interim: 0
update: 9
patch: 0
build: 7
LTS
Quellen

https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html