<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Java_und_Kompatibilit%C3%A4t</id>
	<title>Java und Kompatibilität - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Java_und_Kompatibilit%C3%A4t"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Java_und_Kompatibilit%C3%A4t&amp;action=history"/>
	<updated>2026-05-06T20:04:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Java_und_Kompatibilit%C3%A4t&amp;diff=160&amp;oldid=prev</id>
		<title>Ullrich: /* Neue Klassen und Methoden */</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Java_und_Kompatibilit%C3%A4t&amp;diff=160&amp;oldid=prev"/>
		<updated>2023-09-30T17:30:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Neue Klassen und Methoden&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 30. September 2023, 17:30 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l172&quot;&gt;Zeile 172:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 172:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/plugin&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/plugin&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wichtig beim Kompilieren ist, daß die Klassen auch wirklich neu gebaut werden.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wichtig beim Kompilieren ist, daß die Klassen auch wirklich neu gebaut werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Also durch Löschen des {{java|target}}-Verzeichnisses oder durch ein {{java|mvn clean}}.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Also durch Löschen des {{java|target}}-Verzeichnisses oder durch ein {{java|mvn clean}}.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Andernfalls wird der Compiler nicht erkennen, daß die Klassen neu zu Bauen sind.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Andernfalls wird der Compiler nicht erkennen, daß die Klassen neu zu Bauen sind.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Java_und_Kompatibilit%C3%A4t&amp;diff=158&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Kategorie:Java Eine wesentliche Eigenshaft war von Anfang an die Abwärts-Kompatibilität; nicht nur in Bezug auf den Source- sondern auch auf den Object-Code. Alles was mit einer früheren Java-Version geschrieben und gebaut wurde, war anfangs ohne Änderungen auf jeder späteren Java-Version kompilerbar und lauffähig (zumindest soweit ich mich daran erinnere).  Was das im Einzelnen bedeutet und in wiefern das heute noch Bestand hat ist Thema dieses…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Java_und_Kompatibilit%C3%A4t&amp;diff=158&amp;oldid=prev"/>
		<updated>2023-09-30T17:28:32Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Kategorie:Java&lt;/a&gt; Eine wesentliche Eigenshaft war von Anfang an die Abwärts-Kompatibilität; nicht nur in Bezug auf den Source- sondern auch auf den Object-Code. Alles was mit einer früheren Java-Version geschrieben und gebaut wurde, war anfangs ohne Änderungen auf jeder späteren Java-Version kompilerbar und lauffähig (zumindest soweit ich mich daran erinnere).  Was das im Einzelnen bedeutet und in wiefern das heute noch Bestand hat ist Thema dieses…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
Eine wesentliche Eigenshaft war von Anfang an die Abwärts-Kompatibilität;&lt;br /&gt;
nicht nur in Bezug auf den Source- sondern auch auf den Object-Code.&lt;br /&gt;
Alles was mit einer früheren Java-Version geschrieben und gebaut wurde,&lt;br /&gt;
war anfangs ohne Änderungen auf jeder späteren Java-Version kompilerbar und lauffähig&lt;br /&gt;
(zumindest soweit ich mich daran erinnere).&lt;br /&gt;
&lt;br /&gt;
Was das im Einzelnen bedeutet und in wiefern das heute noch Bestand hat ist Thema dieses Artikels.&lt;br /&gt;
&lt;br /&gt;
= Vorbetrachtungen =&lt;br /&gt;
== Was &amp;quot;Version&amp;quot; bedeutet ==&lt;br /&gt;
Das Java-System besteht aus mehreren Komponenten, die zu einem großen Paket -- den JDK oder dem JRE -- zusammengefaßt werden.&lt;br /&gt;
Dieses Gesamtsystem wird Versioniert. Die &amp;quot;Java-Version&amp;quot; bezeichnet nun die Version &amp;#039;&amp;#039;aller&amp;#039;&amp;#039; im Paket enthaltenen Komponenten.&lt;br /&gt;
Für uns wichtig sind hier:&lt;br /&gt;
* der &amp;#039;&amp;#039;&amp;#039;Compiler&amp;#039;&amp;#039;&amp;#039; der aus dem Java-Quell-Code {{java|.class}} files erzeugt&lt;br /&gt;
* die &amp;#039;&amp;#039;&amp;#039;Bibliotheken&amp;#039;&amp;#039;&amp;#039;, vorkompilierte Klassen die als {{java|.class}} files im Paket enthalten sind&lt;br /&gt;
&lt;br /&gt;
== JDK und JRE ==&lt;br /&gt;
Die JRE (Java Runtime Environment) enthält die JVM (Java Virtual Machine) die den kompilierten Java-Code ausführt&lt;br /&gt;
und die kompilierten Java-Bibliotheken die für die Ausführung unserer Java-Anwendungen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
Der JDK (Java Developement Kit) enthält die JRE und zusätzlich die Tools die zur Erstellung der Anwendung erforderlich sind.&lt;br /&gt;
Allem voran den Java Compiler, alles andere ist hier nicht von Bedeutung. Neben den {{java|.class}}-Files enthält der JDK&lt;br /&gt;
auf den Quell-Code zu den Bibliotheken, führt aber immer die {{java|.claass}} files aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Was den Compiler anbelangt =&lt;br /&gt;
&lt;br /&gt;
== Quell-Code-Kompatibilität ==&lt;br /&gt;
Das bezieht sich auf die Frage, inwiefern Code der für Java X geschrieben wurde mit Java Y gebaut werden kann.&lt;br /&gt;
Grundsätzlich gilt zunächst einmal&lt;br /&gt;
&lt;br /&gt;
 Für jedes X &amp;lt;= Y gilt: Wenn der Code mit Java X baut, baut er auch mit Java Y&lt;br /&gt;
&lt;br /&gt;
Das Gegenteil gilt dementsprechend nicht. Nutzt der Code etwa {{lambda}}-Ausdrücke und damit einen der Operatoren&lt;br /&gt;
{{java|::}} oder {{java|-&amp;gt;}}, so ist er mit Java-Versionen vor 8 nicht kompilierbar.&lt;br /&gt;
&lt;br /&gt;
Die einzige Ausnahme von dieser Regel ist die Verwendung des einzelnen Underscore oder Unterstrich {{java|_}}&lt;br /&gt;
der bis einschließlich Java 8 als Bezeichner erlaubt war. Diese Verwendung führt ab Java 9 zu einem Fehler.&lt;br /&gt;
&lt;br /&gt;
Mit Java 21 kommt der Underscore tatsächlich wieder zurück (das war wohl der Grund für das Verbot in Java 9).&lt;br /&gt;
Diesmal bezeichnet er &amp;quot;unbenannte&amp;quot; Variablen, zu Beispiel Paraneter in {{lambda}}-Ausdrücken, die im Ausdruck selbst&lt;br /&gt;
nicht verwendet werden. Es kann also passieren, daß alter Java-8-Code mit Java 21 bricht.&lt;br /&gt;
&lt;br /&gt;
== Object-Code-Kompatibilität ==&lt;br /&gt;
Unter Object-Code versteht man alles, was beim Kompilier-Vorgang aus dem Compiler kommt.&lt;br /&gt;
Im Falle von Java also vor allem die {{java|.class}}-Files.&lt;br /&gt;
&lt;br /&gt;
Kompatibilität bezieht sich also auf die Frage, ob {{java|.class}} files die mit Java X erzeugt wurden mit Java Y&lt;br /&gt;
verwendet werden können. Und auch hier gilt grundsätzlich:&lt;br /&gt;
&lt;br /&gt;
 Für jedes X &amp;lt;= Y gilt: Wenn das {{java|.class}} files mit Java X gebaut wurde, kann es mit Java Y verwendet werden&lt;br /&gt;
&lt;br /&gt;
Das ist eine extrem mächtige Eigenschaft, die die Verteilung von binary libraries über Maven Central so einfach macht.&lt;br /&gt;
Wenn man den Code auf eine neue Java-Version heben möchte, braucht man dafür nicht sämtliche verwendeten Bibliotheken&lt;br /&gt;
austauschen. Man wird das sicherlich -- früher oder später -- tun, aber für die Migration ist das nicht unmittelbar&lt;br /&gt;
erforderlich und das verkürzt die Zeit bis zum ersten lauffähigen &amp;quot;Migrat&amp;quot; ganz erheblich.&lt;br /&gt;
&lt;br /&gt;
Auch hier gilt das Gegenteil nicht. Es gilt sogar in noch viel strengerem Maße als beim Quell-Code.&lt;br /&gt;
Da jedes {{java|.class}} file eine Versions-Nummer enthält die der Java-Version des verwendeten Compilers entspricht&lt;br /&gt;
und die mit &amp;#039;&amp;#039;jeder&amp;#039;&amp;#039; Java-Version hochgezählt wird, sind Kompilate neuerer Java-Versionen niemals in Java-Systemen&lt;br /&gt;
älterer Versionen verwendbar.&lt;br /&gt;
&lt;br /&gt;
Wie man [https://javaalmanac.io/bytecode/versions/ dieser Auflistung] entnehen kann, haben {{java|.class} files&lt;br /&gt;
die mit Java 8 gebaut wurden die Version 52.0 während Java 11 die Versions-Nummer 55.0 erzeugt.&lt;br /&gt;
&lt;br /&gt;
Es ist dabei völlig unerheblich, welche Java-Features der zugrundeliegende Java-Code enthält.&lt;br /&gt;
&lt;br /&gt;
== Cross-Compiling ==&lt;br /&gt;
&lt;br /&gt;
Der klassische Cross Compiler arbeitet auf einer Rechner-Architektur -- zum Beispiel einem Windows-Rechner -- und&lt;br /&gt;
erzeugt Object-Code der auf einer anderen Architektur -- zum Beispiel auf einem MacOS-Rechner -- läuft.&lt;br /&gt;
Für Java ist das ohne Bedeutung weil jeder Java-Object-Code der auf einer beliebigen Maschine gebaut wurde &lt;br /&gt;
auf jeder beliebigen anderen Maschine läuft.&lt;br /&gt;
&lt;br /&gt;
Wir verstehen daher -- zweckmäßigerweise -- unter cross compiling im Java-Kontext:&lt;br /&gt;
&lt;br /&gt;
 Mit Java X wird ein {{java|.class}} file für Java Y erzeugt, wobei X &amp;gt; Y ist&lt;br /&gt;
&lt;br /&gt;
Das Erzeugen zukünftiger Java-Versionen wäre wenig sinnvoll und geht schon deshalb nicht, weil der Compiler nicht in die Zukunft schauen kann.&lt;br /&gt;
So haben {{java|.class}} files für Java 1.0 die Versionsnummer 45.3 während die für Java 1.1 die Nummer 45.3 haben.&lt;br /&gt;
Man kann also unnmöglich sagen was werden wird.&lt;br /&gt;
&lt;br /&gt;
Wir könne also beispielsweise mit Java 11 ein {{java|.class}} file bauen, das mit Java 8 verwendbar ist.&lt;br /&gt;
&lt;br /&gt;
Die Möglichkeit des cross compiling bietet der Java-Compiler seit der Version 1.5.&lt;br /&gt;
&lt;br /&gt;
= Was die Bibliotheken anbelangt =&lt;br /&gt;
&lt;br /&gt;
Der Einfachheit halber machen wir hier JDK und JRe keinen Unterschied -- was bei Betrachtung der enthaltenen Bibliotheken auch keine Rolle spielt.&lt;br /&gt;
&lt;br /&gt;
Mit dem nackten Java-Compiler eine anspruchsvolle Anwendung zu bauen wäre extrem aufwändig, denn die vielen&lt;br /&gt;
Bibliotheken die man dafür benötigt selbst zu schreiben ist ein ermüdendes Geschäft und das riesige Sortiment an Java-Bibliotheken&lt;br /&gt;
macht Java so vielseitig.&lt;br /&gt;
&lt;br /&gt;
Der JDK bringt bereits eine große Menge wichtiger Bibliotheken mit und es sind im Laufe der Zeit immer mehr geworden.&lt;br /&gt;
&lt;br /&gt;
== Das Verschwinden von Bibliotheken ==&lt;br /&gt;
Solange die Veränderung nur in der Vergößerung - das Hinzufügen neuer Klassen und Methoden -- besteht, gibt es beim&lt;br /&gt;
Umstieg auf eine höhere Java-Version keine Probleme weil der neue JDK alles enthält was der ältere JDK auch dabei hatte.&lt;br /&gt;
&lt;br /&gt;
Mit Version 8 begann Oracle damit, den JDK auszudünnen und so viel Code wie möglich herauszulösen.&lt;br /&gt;
Das bedeutet, daß ein Umstieg von einer älteren auf eine neuere Version mit -- teilweise erheblichem -- Aufwand verbunden ist.&lt;br /&gt;
In den meisten Fällen ist es aber damit getan, die fehlenden Bibliotheken -- z.B. aus Maven Central -- zu beschaffen und in den&lt;br /&gt;
class path aufzunehmen. Der Code selbst muß dabei in der Regel nicht angefaßt werden.&lt;br /&gt;
&lt;br /&gt;
Was auch schon früher gemacht wurde, ist das Beseitigen abgekündigter Features und der zugehörigen Bibliotheken.&lt;br /&gt;
Hier muß der Code üblicherweise nachbearbeitet werden, weil die herausgefallenen Klassen nicht mehr verwendet werden sollten.&lt;br /&gt;
Dabei ist es wichtig daruf zu achten welche Klassen und Methoden abgekündigt werden. In der Regel geschieht das durch &lt;br /&gt;
die {{java|@Deprecated}}-Annotation.&lt;br /&gt;
&lt;br /&gt;
== Neue Klassen und Methoden ==&lt;br /&gt;
Neuere JDK-Versionen enthalten erwartungsgemäß immer auch neue Klassen und Methoden für die neuen Features.&lt;br /&gt;
Da sie im alten JDK unbekannt waren, sind sie im Code nicht anzutreffen, führen also nicht zu Problemen.&lt;br /&gt;
&lt;br /&gt;
Es giebt jedoch ein Problem, das aus der Diskrepanz zwischen Entwicklung und Betrieb enstehen kann.&lt;br /&gt;
Stellen wir uns dazu die folgende Situation vor:&lt;br /&gt;
&lt;br /&gt;
 Die Software läuft im Betrieb auf dem JRE in Version 8, während die Entwicklung den JDK 11 verwendet.&lt;br /&gt;
&lt;br /&gt;
Das ist gängige Praxis wenn die Umstellung der Java-Version bereits geplant ist. Der existierende Java-8-Code wird mit dem JDK 11&lt;br /&gt;
kompiliert, die Bibliotheken werden ersetzt und die Entwicklung geht nun mit dem JDK 11 weiter. Das funktioniert, weil die für den&lt;br /&gt;
Betrieb benötigten {{java|.class}}-Files per Cross-Compiling erzeugt werden können -- soweit so gut.&lt;br /&gt;
&lt;br /&gt;
Ein Entwickler schreibt nun folgende Methode:&lt;br /&gt;
{{java|code=&lt;br /&gt;
    public boolean leer(String value) {&lt;br /&gt;
        Optional&amp;lt;String&amp;gt; x = Optional.ofNullable(value);&lt;br /&gt;
        return x.isEmpty();&lt;br /&gt;
    }&lt;br /&gt;
}}&lt;br /&gt;
Der Code kompiliert ohne Probleme, die Software wird in betrieb genommen und -- scheitert. Warum?&lt;br /&gt;
&lt;br /&gt;
Das Maven-Compiler-Pluging war folgendermaßen konfiguriert:&lt;br /&gt;
{{xml|code=&lt;br /&gt;
  &amp;lt;plugin&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;configuration&amp;gt;&lt;br /&gt;
      &amp;lt;target&amp;gt;8&amp;lt;/target&amp;gt;&lt;br /&gt;
    &amp;lt;/configuration&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Der Compiler generiert pflichtgemäß Java-8-kompatiblen Code, aber ein Blick in die {{java|Optional}}-Klasse des JDK 11 zeigt:&lt;br /&gt;
{{java|code=&lt;br /&gt;
  /**&lt;br /&gt;
    * If a value is  not present, returns {@code true}, otherwise&lt;br /&gt;
    * {@code false}.&lt;br /&gt;
    *&lt;br /&gt;
    * @return  {@code true} if a value is not present, otherwise {@code false}&lt;br /&gt;
    * @since   11&lt;br /&gt;
    */&lt;br /&gt;
    public boolean isEmpty() {&lt;br /&gt;
        return value == null;&lt;br /&gt;
    }&lt;br /&gt;
}}&lt;br /&gt;
Die Java-11-Version der Klasse ist tatsächlich Java-8-kompatibel, die Methode {{java|isEmpty}} ist jedoch nicht in der Version&lt;br /&gt;
des JDK 8 enthalten. Deshalb läuft die Software im Betrieb auf einen Fehler.&lt;br /&gt;
&lt;br /&gt;
Seit Java 9 gibt es die Compiler-Option {{java|release}}, die bei diesem Problem bereits im Kompilier-Vorgang einen Fehler erzeugt.&lt;br /&gt;
Sie sorgt dafür daß der Compiler sicherstellt, daß der Code keine Features verwendet werden die in der Ziel-Version noch nicht verfügbar sind.&lt;br /&gt;
In der Maven-plugin-Konfiguration schreibt man daher:&lt;br /&gt;
{{xml|code=&lt;br /&gt;
  &amp;lt;plugin&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;configuration&amp;gt;&lt;br /&gt;
      &amp;lt;release&amp;gt;8&amp;lt;/release&amp;gt;&lt;br /&gt;
    &amp;lt;/configuration&amp;gt;&lt;br /&gt;
  &amp;lt;/plugin&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Wichtig beim Kompilieren ist, daß die Klassen auch wirklich neu gebaut werden.&lt;br /&gt;
Also durch Löschen des {{java|target}}-Verzeichnisses oder durch ein {{java|mvn clean}}.&lt;br /&gt;
Andernfalls wird der Compiler nicht erkennen, daß die Klassen neu zu Bauen sind.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>