Java auf dem Raspberry Pi installieren: Aktuelle JRE Laufzeitumgebung/JDK (z.B. Java 17) kostenfrei & legal 2021

Als Video ansehen
Bereitgestellt über YouTube

Java auf dem Raspberry Pi installieren: Aktuelle JRE Laufzeitumgebung/JDK (z.B. Java 17) kostenfrei & legal 2021

Obwohl Java bereits 1995 erschien, ist es nach wie vor eine beliebte und solide Programmiersprache. Das Starten der Programme in der virtuellen Maschine von Java (JVM) macht die entwickelte Software plattformunabhängig und damit auch für den Raspberry Pi interessant: Im Gegensatz zu beispielsweise C oder C++ muss Java-Code nicht für die ARM-Architektur des Pi neu kompiliert werden – diese Unterschiede abstrahiert die Laufzeitumgebung.

Welches Java?

Man muss zwischen der Programmiersprache und der dahinter stehenden Plattform. unterscheiden. Letzteres wird in Form einer Laufzeitumgebung implementiert. Oft war die Implementierung von Oracle gemeint, wenn man von Java sprach – 2018 wurde sie von 70% der Java-Entwickler verwendet. 2019 kam es jedoch zu einem Paukenschlag: Oracle schränkte die Lizenzbedingungen massiv ein. Seitdem können nur noch Privatanwender Oracles Java-Laufzeitumgebung ohne Lizenzkosten nutzen, ältere Versionen lassen sich zudem ohne Oracle-Konto nicht mehr herunterladen. In vielen Linux-Paketquellen wurde es daher entfernt, unter anderem auch beim Raspberry Pi. Zumal Oracle ab Java 8 keine aktuelleren Builds mehr für ARM mit der 32-Bit Architektur bereitstellt – darauf läuft die klare Mehrheit der Pis.

Verbreitung der verschiedenen Java-Implementierungen im Jahre 2018 – Quelle: JVM Ecosystem Report

Vereinzelt existieren Pseudo-Pakete, die mit gebastelten Skripten Java beim Nutzer herunterladen und so versuchen, Oracles Lizenzbedingungen zu umgehen. Eine nachhaltigere Alternative zu dieser Symptombekämpfung ist dagegen freie, quelloffene Software. Und die gibt es: OpenJDK ist die offizielle und verbreiteteste Implementierung der Java-Plattform. Zunehmend wird OpenJDK sogar von mehr und mehr Programmen selbst unterstützt. Die Wahrscheinlichkeit ist daher groß, dass eure Java-Programme darauf laufen. Im Gegensatz zu Oracle’s Java spart man sich einiges an Gefrickel und blickt nicht in eine ungewisse Zukunft. Im Folgenden möchte ich mich daher auf die freie OpenJDK-Implementierung konzentrieren.

JRE oder JDK?

Um Java-Programme lediglich zu starten, genügt die Java Runtime Environment, kurz JRE. Sie enthält die JVM, die zur Ausführung benötigt wird. Wenn ihr selbst Java-Programme schreiben möchtet, ist das Java Devekopment Kit (JDK) notwendig. Für viele Versionen sind aber keine JRE-Builds verfügbar, zumindest nicht für die 32Bit ARM-Plattform. Alternativ kann man auf das JDK ausweichen. Es ist größer und enthält Bestandteile die nicht benötigt werden wie z.B. den Compiler. Funktionieren wird es in der Regel genau so, da die Laufzeitumgebung auch enthalten ist. Auch die Installation ist identisch. Sofern ihr nicht programmieren möchtet und die gewünschte Version als JRE Build für ARM in 32 Bit verfügbar ist, würde ich diese bevorzugen.

OpenJDK 17 ist für die 32Bit ARM-Plattform nur als JDK, nicht als schlankere JRE verfügbar

Ist bereits eine Java-Version installiert?

Vor der Installation sollte geprüft werden, ob Java bereits installiert ist. Am einfachsten geht dies mit dem Befehl „java -version“ auf der Konsole: Dies gibt uns die Version auf, falls Java bereits installiert ist. Ansonsten erhalten wir einen Fehler:

$ java -version
-bash: java: command not found

JRE Laufzeitumgebung per Paketverwaltung installieren

Je nachdem welche Version ihr benötigt, kann man OpenJDK sogar über die Paketquellen installieren: In Raspberry Pi OS 10 ist es bis Einschließlich der LTS-Version 11 enthalten. Es verwendet die gleichen Versionsnummern wie Oracle, d.H. Java 8 heißt dort OpenJDK 8.

$ apt-cache search openjdk-[0-9]+-jre-headless
default-jre-headless - Standard Java or Java compatible Runtime (headless)
openjdk-10-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-11-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-8-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-9-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)

Per apt install kann man die gewünschte Version installieren, etwa mit

sudo apt install openjdk-11-jre-headless

Die JDK-Pakete enthält man durch Ersetzen von jre mit jdk, Beispiel:

sudo apt install openjdk-11-jdk-headless

Neuere JRE- und JDK-Versionen wie z.B. Java 17 installieren

Die derzeit aktuelle LTS-Version 17 kommt erst mit Debian 11 in die offiziellen Paketquellen. Es ist im August 2021 erschienen, für das darauf aufbauende Raspberry Pi OS gibt es derzeit keinen Veröffentlichungstermin. Wer eine aktuellere Version benötigt (z.B. für einen Spigot Minecraft-Server, dort wird zurzeit mindestens 16 gefordert, wobei 16 bereits end of life ist und man daher 17 nehmen sollte), kann diese jedoch händisch installieren.

Bestimmte Programme fordern eine neuere Java-Version, als in den offiziellen Paketquellen derzeit verfügbar – hier am Beispiel der Buildtools für Spigot demonstriert, die bei einer älteren Version als 16 den Dienst einstellen.

Sofern möglich würde ich die LTS-Version bevorzugen, da diese tendenziell länger mit Aktualisierungen versorgt wird. Somit im Moment Version 17. Es ist zu empfehlen, auf der Release-Seite die aktuellste Version zu prüfen und diese mit den Anforderungen des gewünschten Java-Programmes abzugleichen. Bei der Seite handelt es sich um die ehemalige AdoptOpenJDK Seite, die zur Eclipse-Foundation migriert ist. Den Downloadlink zum Archiv kann man kopieren und direkt auf den Pi laden:

wget -O openjdk.tar.gz https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_arm_linux_hotspot_17_35.tar.gz

Entsprechend der Standard-Verzeichnisse von Linux würde ich das Archiv in /opt entpacken. Es ist für optionale, selbst installierte Programme vorgesehen, die man an der Paketverwaltung vorbei installiert.

sudo mkdir /opt/openjdk17
sudo chown pi:pi /opt/openjdk17
tar xvzf openjdk.tar.gz --strip-components=1 -C /opt/openjdk17

Man könnte Java nun über /opt/openjdk17/bin/java nutzen. Allerdings sollten wir noch die Umgebungsvariablen setzen, das ist komfortabler und vermeidet zukünftige Probleme (v.a. wenn JAVA_HOME fehlt). Dazu öffnen wir entweder ~/.bashrc für den aktuellen Nutzer oder /etc/bash.bashrc (mit root Rechten), wenn Java für alle Benutzer verfügbar sein soll:

sudo vim /etc/bash.bashrc

und fügen dort folgende zwei Zeilen ein:

JAVA_HOME=/opt/openjdk17
PATH=$PATH:$JAVA_HOME/bin

Schließt man die Konsole und loggt sich neu ein (oder lädt alternativ die Datei mit source /etc/bash.bashrc neu), sollte der Aufruf von java -version funktionieren und die zuvor heruntergeladene Version anzeigen:

$ java -version
openjdk version "17" 2021-09-14
OpenJDK Runtime Environment Temurin-17+35 (build 17+35)
OpenJDK Server VM Temurin-17+35 (build 17+35, mixed mode, sharing)

Leider hat diese Variante auch einen Nachteil: Da sie nicht von der Paketverwaltung installiert wurde, kann sie auch nicht darüber aktuell gehalten werden. Hier sollte man daher selbst am besten regelmäßig die Downloadseite prüfen und Aktualisierungen einspielen – vor allem dann, wenn es sich um Sicherheitsupdates handelt. Nachdem man ggf. laufende Java-Anwendungen gestoppt hat, genügt es, das neue Archiv herunterzuladen und zu entpacken, wie oben angegeben.

Quellen und weitere Informationen

https://openjdk.java.net/
https://www.heise.de/developer/meldung/Oracle-Ende-fuer-oeffentliche-Updates-von-Java-8-ab-Februar-2019-4035059.html
https://endoflife.date/java
https://www.linuxuprising.com/2021/09/how-to-install-oracle-java-17-lts-on.html
https://launchpad.net/~webupd8team/+archive/ubuntu/java
https://packages.debian.org/bullseye/openjdk-17-jdk-headless

Leave a Reply