# OpenJDK als JRE | Open Java Runtime für Windows



## memo1990 (2. Nov 2018)

Hallo zusammen,

Oracle bietet ab der Java Version 11 ja kein JRE zum Download mehr an. Wenn ich meine Software an einem Privatkunden vertreibe und er die JRE installieren muss, wie läuft das in Zukunft unter Windows ab? Unter Linux gibt es ja in den entsprechenden Repositories die OpenJDK-jre zum herunterladen.

Theoretisch kann man die Binaries von OpenJDK für Windows auch das Ausführen von Java-Programmen verwenden. Aber das kann man von einem, der sich mit der Materie nicht auskennt, nicht verlangen. Meine Programme kompiliere ich mit OpenJDK 11, da kann man die JRE 8 ja nicht verwenden.

Mit freundlichen Grüßen
Memo1990


----------



## mrBrown (2. Nov 2018)

memo1990 hat gesagt.:


> Theoretisch kann man die Binaries von OpenJDK für Windows auch das Ausführen von Java-Programmen verwenden. Aber das kann man von einem, der sich mit der Materie nicht auskennt, nicht verlangen.



Wenn du von einem ohne Ahnung nicht verlangen kannst, Programme auszuführen, wie soll der dann dein Programm ausführen? 


Als Alternative: liefer deiner Anwendung zusammen mit einer passenden Runtime aus.


----------



## memo1990 (2. Nov 2018)

mrBrown hat gesagt.:


> Wenn du von einem ohne Ahnung nicht verlangen kannst, Programme auszuführen, wie soll der dann dein Programm ausführen?



Ich glaube man weiß wie ich das gemeint habe. Der Anwender weiß wie das Programm zu bedienen ist, aber nicht wie man noch Umgebungsvariablen in Windows einrichtet und das Programm dann über ein Terminal startet.


----------



## mrBrown (2. Nov 2018)

Ne, ehrlich gesagt weiß ich das nicht...
Man musste doch schon immer die PATH-Variable selber anpassen, auch mit OracleJRE:


			
				https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jre_install.html#A1099373 hat gesagt.:
			
		

> You must set the PATH environment variable to point to JAVA_HOME\bin


Groß anders ist die OpenJDK-Installation nicht wirklich: entpacken (statt exe ausführen) und PATH setzen.
Oder passieren bei der Oracle Installation noch irgendwelche magischen Dinge im Hintergrund? 


Eine andere Möglichkeit ist aber, ein passendes JRE mit der Applikation auszuliefern, Java 11 bietet die Tools dafür. Dann ist man gänzlich unabhängig von der installierten Version.


----------



## memo1990 (2. Nov 2018)

mrBrown hat gesagt.:


> Man musste doch schon immer die PATH-Variable selber anpassen, auch mit OracleJRE



Soweit ich mich noch erinnern kann, konnte ich nach der Oracle JRE die Jar-Archive direkt ausführen. Ohne setzen der Umgebungsvariablen.



mrBrown hat gesagt.:


> Groß anders ist die OpenJDK-Installation nicht wirklich: entpacken (statt exe ausführen) und PATH setzen.



Das ist es ja, OpenJDK wird nicht als Installer angeboten, sondern als Archiv zum entpacken.



mrBrown hat gesagt.:


> Eine andere Möglichkeit ist aber, ein passendes JRE mit der Applikation auszuliefern, Java 11 bietet die Tools dafür.



Wie meinst du das? Welche Tools?


----------



## mihe7 (3. Nov 2018)

Er meint jlink.

In Zukunft wirst Du die Anwendung samt eines auf die Anwendung zugeschnittenen JREs ausliefern müssen. Die Zeiten eines zentral installierten JREs sind nach dem Willen Oracles vorbei: 

"As client application development continues to shift from the old “plugin” world to modern deployment, the need for a standalone Java Runtime Environment (JRE) that is installed centrally, separately from Java applications has diminished.  Using the ‘jlink’ tool introduced with JDK 9 will make it even easier for application developers to package and deploy dedicated runtimes rather than relying on a pre-installed system JRE." (Quelle: https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se)

Leichtgewichtige, plattformübergreifend funktionierende Plugins out sind, während der "moderne" Client(!)-Application-Developer heutzutage einfach das komplette Runtime mit ausliefert. Außerdem dürfen wir lernen, dass es schneller und einfacher ist, ein 50 MB+ plattformabhängiges Runtime zu erstellen und zusätzlich zur eigentlichen Anwendung auszuliefern als darauf zu vertrauen, dass beim Kunden schon ein JRE installiert ist (oder wird). Endlich weiß ich auch, dass es schneller und einfacher ist, für meine Anwendung ein Runtime unter Linux, Windows, ... zu erzeugen, weil jlink nicht plattformübergreifend funktioniert. Gut, den Mac muss man halt zur Not bestellen. Gott sei Dank gibt es bei Oracle Leute, die uns nicht dumm sterben lassen.


----------



## memo1990 (5. Nov 2018)

Guten Abend zusammen,

ich habe mich mal über die Modularisierung von Java (dass es ja seit Java 9 gibt) schlau gemacht. Das habe ich auch soweit verstanden. Aber das mit jlink verstehe ich noch nicht so ganz. Kann mir jemand eine gut und leicht verständliche Referenz dazu geben oder kurz erklären?

Was für eine Datei kommt mit jlink am Ende raus, eine .exe (Worin alle benötigten Ressourcen inkl. der JVM enthalten sind)?


----------



## mihe7 (5. Nov 2018)

Im Prinzip gibst Du die Module an und ein Verzeichnis und hinterher hast Du in diesem ein "JDK/JRE", das allen angegebenen Module enthält.

Ruf einfach mal `jlink --output test --add-modules java.base` auf. Dann erhältst Du im Verzeichnis test ein "JRE", das nur das Base-Module enthält.

Eigene Module packst Du mit --module-path und --add-modules dazu. Wenn Du einen eigenen Launcher haben willst, packst Du noch --launcher hintendran.

jlink --output test --module-path foo.jar --add-modules java.base,meinModul --launcher meinTest=meinModul

Erzeugt ein Verzeichnis test, das ein JRE enthält, das aus dem Base-Modul und meinModul besteht. Dabei ist foo.jar ein "modulares JAR" mit dem Modul "meinModul". Außerdem wird ein ausführbarer Launcher namens "meinTest" im bin-Verzeichnis erstellt (unter Windows wäre das meinText.exe).

Ergebnis unter Linux (JDK 10):


Spoiler: Dateiliste





```
test/bin/keytool
test/bin/java
test/bin/meinTest
test/conf/security/policy/README.txt
test/conf/security/policy/unlimited/default_local.policy
test/conf/security/policy/unlimited/default_US_export.policy
test/conf/security/policy/limited/exempt_local.policy
test/conf/security/policy/limited/default_local.policy
test/conf/security/policy/limited/default_US_export.policy
test/conf/security/java.policy
test/conf/security/java.security
test/conf/net.properties
test/include/jni.h
test/include/linux/jni_md.h
test/include/jvmti.h
test/include/jvmticmlr.h
test/include/classfile_constants.h
test/legal/java.base/zlib.md
test/legal/java.base/LICENSE
test/legal/java.base/aes.md
test/legal/java.base/ASSEMBLY_EXCEPTION
test/legal/java.base/cldr.md
test/legal/java.base/icu.md
test/legal/java.base/asm.md
test/legal/java.base/ADDITIONAL_LICENSE_INFO
test/lib/libnio.so
test/lib/libjsig.so
test/lib/libverify.so
test/lib/jvm.cfg
test/lib/jli/libjli.so
test/lib/libnet.so
test/lib/tzdb.dat
test/lib/security/cacerts
test/lib/security/default.policy
test/lib/security/blacklisted.certs
test/lib/modules
test/lib/server/libjsig.so
test/lib/server/Xusage.txt
test/lib/server/libjvm.so
test/lib/jexec
test/lib/jrt-fs.jar
test/lib/libzip.so
test/lib/libjava.so
test/lib/libjimage.so
test/lib/client/libjsig.so
test/lib/client/Xusage.txt
test/lib/client/libjvm.so
test/lib/classlist
```


----------



## memo1990 (5. Nov 2018)

Danke @mihe7 für deine Erklärung. Statt es ständig über das Terminal zu erledigen und ich eh mit der Eclipse IDE arbeite, geht das auch unter Eclipse? Onkel Google konnte mir nichts ausspucken.


----------



## mihe7 (5. Nov 2018)

memo1990 hat gesagt.:


> geht das auch unter Eclipse?


Keine Ahnung.


----------



## darkwall (18. Nov 2019)

Hi, gibt es irgendwo eine gute und einfache Anleitung, wie man ein Paket unter Java 11 baut?
Ich habe bisher mit Netbeans entwickelt und dann (Java 8) die JAR-Dateien mit der JRE für Linux und Windows verpackt, so dass diese dann einfach so vom z.B. USB-Stick aus laufen. 
Wenn ich richtig verstanden habe, wird das nun mit JLink überflüssig. Wie genau mache ich das aber? Kann ich Windows Pakete nur unter Windows erzeugen und Linux-Pakete nur unter Linux?
Besten Dank für jede Hilfe!


----------



## mihe7 (18. Nov 2019)

Scheint mir auf den ersten Blick ganz brauchbar zu sein: https://www.logicbig.com/tutorials/core-java-tutorial/java-9-changes/jlink.html


----------



## darkwall (18. Nov 2019)

Sieht gut aus! Danke für den Link!


----------

