{"id":7772,"date":"2021-10-13T16:07:00","date_gmt":"2021-10-13T14:07:00","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7772"},"modified":"2022-12-12T18:27:42","modified_gmt":"2022-12-12T16:27:42","slug":"java-auf-dem-raspberry-pi-installieren-aktuelle-jre-laufzeitumgebung-jdk-z-b-java-17-kostenfrei-legal-2021","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/java-auf-dem-raspberry-pi-installieren-aktuelle-jre-laufzeitumgebung-jdk-z-b-java-17-kostenfrei-legal-2021\/","title":{"rendered":"Java auf dem Raspberry Pi installieren: Aktuelle JRE Laufzeitumgebung\/JDK (z.B. Java 17) kostenfrei &#038; legal 2021"},"content":{"rendered":"<p>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\u00e4ngig und damit auch f\u00fcr den Raspberry Pi interessant: Im Gegensatz zu beispielsweise C oder C++ muss Java-Code nicht f\u00fcr die ARM-Architektur des Pi neu kompiliert werden &#8211; diese Unterschiede abstrahiert die Laufzeitumgebung.<\/p>\n<h2 class=\"wp-block-heading\" id=\"welches-java\">Welches Java?<\/h2>\n<p>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 &#8211; 2018 wurde sie von 70% der Java-Entwickler verwendet. 2019 kam es jedoch zu einem Paukenschlag: Oracle schr\u00e4nkte die Lizenzbedingungen massiv ein. Seitdem k\u00f6nnen nur noch Privatanwender Oracles Java-Laufzeitumgebung ohne Lizenzkosten nutzen, \u00e4ltere 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\u00fcr ARM mit der 32-Bit Architektur bereitstellt &#8211; darauf l\u00e4uft die klare Mehrheit der Pis.<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"460\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-26.png\" alt=\"\" class=\"wp-image-7790\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-26.png 769w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-26-300x179.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-26-70x42.png 70w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/a><figcaption class=\"wp-element-caption\">Verbreitung der verschiedenen Java-Implementierungen im Jahre 2018 &#8211; Quelle: <a href=\"https:\/\/snyk.io\/blog\/jvm-ecosystem-report-2018\/\" target=\"_blank\" rel=\"nofollow\">JVM Ecosystem Report<\/a><\/figcaption><\/figure>\n<p>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\u00e4mpfung 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\u00fctzt. Die Wahrscheinlichkeit ist daher gro\u00df, dass eure Java-Programme darauf laufen. Im Gegensatz zu Oracle&#8217;s Java spart man sich einiges an Gefrickel und blickt nicht in eine ungewisse Zukunft. Im Folgenden m\u00f6chte ich mich daher auf die freie OpenJDK-Implementierung konzentrieren.<\/p>\n<h2 class=\"wp-block-heading\" id=\"jre-oder-jdk\">JRE oder JDK?<\/h2>\n<p>Um Java-Programme lediglich zu starten, gen\u00fcgt die Java Runtime Environment, kurz JRE. Sie enth\u00e4lt die JVM, die zur Ausf\u00fchrung ben\u00f6tigt wird. Wenn ihr selbst Java-Programme schreiben m\u00f6chtet, ist das Java Devekopment Kit (JDK) notwendig. F\u00fcr viele Versionen sind aber keine JRE-Builds verf\u00fcgbar, zumindest nicht f\u00fcr die 32Bit ARM-Plattform. Alternativ kann man auf das JDK ausweichen. Es ist gr\u00f6\u00dfer und enth\u00e4lt Bestandteile die nicht ben\u00f6tigt 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\u00f6chtet und die gew\u00fcnschte Version als JRE Build f\u00fcr ARM in 32 Bit verf\u00fcgbar ist, w\u00fcrde ich diese bevorzugen.<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1019\" height=\"636\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25.png\" alt=\"\" class=\"wp-image-7788\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25.png 1019w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25-300x187.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25-768x479.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-25-70x44.png 70w\" sizes=\"auto, (max-width: 1019px) 100vw, 1019px\" \/><\/a><figcaption class=\"wp-element-caption\">OpenJDK 17 ist f\u00fcr die 32Bit ARM-Plattform nur als JDK, nicht als schlankere JRE verf\u00fcgbar<\/figcaption><\/figure>\n<h2 class=\"wp-block-heading\" id=\"ist-bereits-eine-java-version-installiert\">Ist bereits eine Java-Version installiert?<\/h2>\n<p>Vor der Installation sollte gepr\u00fcft werden, ob Java bereits installiert ist. Am einfachsten geht dies mit dem Befehl &#8222;java -version&#8220; auf der Konsole: Dies gibt uns die Version auf, falls Java bereits installiert ist. Ansonsten erhalten wir einen Fehler:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ java -version\n-bash: java: command not found<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"jre-laufzeitumgebung-per-paketverwaltung-installieren\">JRE Laufzeitumgebung per Paketverwaltung installieren<\/h2>\n<p>Je nachdem welche Version ihr ben\u00f6tigt, kann man OpenJDK sogar \u00fcber die Paketquellen installieren: In Raspberry Pi OS 10 ist es bis Einschlie\u00dflich der LTS-Version 11 enthalten. Es verwendet die gleichen Versionsnummern wie Oracle, d.H. Java 8 hei\u00dft dort OpenJDK 8.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ apt-cache search openjdk-[0-9]+-jre-headless\ndefault-jre-headless - Standard Java or Java compatible Runtime (headless)\nopenjdk-10-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)\nopenjdk-11-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)\nopenjdk-8-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)\nopenjdk-9-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)<\/code><\/pre>\n<p>Per apt install kann man die gew\u00fcnschte Version installieren, etwa mit<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt install openjdk-11-jre-headless<\/code><\/pre>\n<p>Die JDK-Pakete enth\u00e4lt man durch Ersetzen von <strong>jre <\/strong>mit <strong>jdk<\/strong>, Beispiel:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt install openjdk-11-jdk-headless<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"neuere-jre-und-jdk-versionen-wie-z-b-java-17-installieren\">Neuere JRE- und JDK-Versionen wie z.B. Java 17 installieren<\/h2>\n<p>Die derzeit aktuelle LTS-Version 17 kommt erst mit Debian 11 in die offiziellen Paketquellen. Es ist im August 2021 erschienen, f\u00fcr das darauf aufbauende Raspberry Pi OS gibt es derzeit keinen Ver\u00f6ffentlichungstermin. Wer eine aktuellere Version ben\u00f6tigt (z.B. f\u00fcr 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\u00e4ndisch installieren.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"214\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-1024x214.png\" alt=\"\" class=\"wp-image-7800\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-1024x214.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-300x63.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-768x160.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-1536x321.png 1536w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38-70x15.png 70w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/MobaXterm_2021-10-12_01-41-38.png 1551w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Bestimmte Programme fordern eine neuere Java-Version, als in den offiziellen Paketquellen derzeit verf\u00fcgbar &#8211; hier am Beispiel der Buildtools f\u00fcr Spigot demonstriert, die bei einer \u00e4lteren Version als 16 den Dienst einstellen.<\/figcaption><\/figure>\n<p>Sofern m\u00f6glich w\u00fcrde ich die LTS-Version bevorzugen, da diese tendenziell l\u00e4nger mit Aktualisierungen versorgt wird. Somit im Moment Version 17. Es ist zu empfehlen, <a href=\"https:\/\/adoptium.net\/releases.html?variant=openjdk17&amp;jvmVariant=hotspot\" target=\"_blank\" rel=\"nofollow\">auf der Release-Seite die aktuellste Version zu pr\u00fcfen<\/a> und diese mit den Anforderungen des gew\u00fcnschten 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:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">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<\/code><\/pre>\n<p>Entsprechend der Standard-Verzeichnisse von Linux w\u00fcrde ich das Archiv in<strong> \/opt<\/strong> entpacken. Es ist f\u00fcr <strong>opt<\/strong>ionale, selbst installierte Programme vorgesehen, die man an der Paketverwaltung vorbei installiert.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo mkdir \/opt\/openjdk17\nsudo chown pi:pi \/opt\/openjdk17\ntar xvzf openjdk.tar.gz --strip-components=1 -C \/opt\/openjdk17<\/code><\/pre>\n<p>Man k\u00f6nnte Java nun \u00fcber <strong>\/opt\/openjdk17\/bin\/java<\/strong> nutzen. Allerdings sollten wir noch die Umgebungsvariablen setzen, das ist komfortabler und vermeidet zuk\u00fcnftige Probleme (v.a. wenn JAVA_HOME fehlt). Dazu \u00f6ffnen wir entweder ~\/.bashrc f\u00fcr den aktuellen Nutzer oder \/etc\/bash.bashrc (mit root Rechten), wenn Java f\u00fcr alle Benutzer verf\u00fcgbar sein soll:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo vim \/etc\/bash.bashrc<\/code><\/pre>\n<p>und f\u00fcgen dort folgende zwei Zeilen ein:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">JAVA_HOME=\/opt\/openjdk17\nPATH=$PATH:$JAVA_HOME\/bin<\/code><\/pre>\n<p>Schlie\u00dft man die Konsole und loggt sich neu ein (oder l\u00e4dt alternativ die Datei mit <strong>source \/etc\/bash.bashrc<\/strong> neu), sollte der Aufruf von java -version funktionieren und die zuvor heruntergeladene Version anzeigen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ java -version\nopenjdk version &quot;17&quot; 2021-09-14\nOpenJDK Runtime Environment Temurin-17+35 (build 17+35)\nOpenJDK Server VM Temurin-17+35 (build 17+35, mixed mode, sharing)<\/code><\/pre>\n<p>Leider hat diese Variante auch einen Nachteil: Da sie nicht von der Paketverwaltung installiert wurde, kann sie auch nicht dar\u00fcber aktuell gehalten werden. Hier sollte man daher selbst am besten regelm\u00e4\u00dfig die Downloadseite pr\u00fcfen und Aktualisierungen einspielen &#8211; vor allem dann, wenn es sich um Sicherheitsupdates handelt. Nachdem man ggf. laufende Java-Anwendungen gestoppt hat, gen\u00fcgt es, das neue Archiv herunterzuladen und zu entpacken, wie oben angegeben.<\/p>\n<h2 class=\"wp-block-heading\" id=\"quellen-und-weitere-informationen\">Quellen und weitere Informationen<\/h2>\n<p>https:\/\/openjdk.java.net\/\r\nhttps:\/\/www.heise.de\/developer\/meldung\/Oracle-Ende-fuer-oeffentliche-Updates-von-Java-8-ab-Februar-2019-4035059.html\r\nhttps:\/\/endoflife.date\/java\r\nhttps:\/\/www.linuxuprising.com\/2021\/09\/how-to-install-oracle-java-17-lts-on.html\r\nhttps:\/\/launchpad.net\/~webupd8team\/+archive\/ubuntu\/java\r\nhttps:\/\/packages.debian.org\/bullseye\/openjdk-17-jdk-headless<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00e4ngig und damit auch f\u00fcr den Raspberry Pi interessant: Im Gegensatz zu beispielsweise C oder C++ muss Java-Code nicht f\u00fcr die ARM-Architektur des Pi neu &#8230;<\/p>\n","protected":false},"author":5,"featured_media":7824,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[87,977,976,978],"class_list":["post-7772","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-java","tag-jdk","tag-jre","tag-openjdk"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7772"}],"version-history":[{"count":15,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7772\/revisions"}],"predecessor-version":[{"id":9822,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7772\/revisions\/9822"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/7824"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}