Mit Java 9 wurde jlink eingeführt - damit lässt sich zusammen mit dem Modulsystem ein Anwendungsspezifisches JRE bauen. Anstatt ein instaliertes JRE vorauszusetzen und nur eine Jar auszuliefern, liefert man damit sowohl die Anwendung als auch die Laufzeitumgebung aus.
Nutzen lässt sich dies auch zusammen mit JavaFX, insbesondere gibt es extra für JavaFX ein Maven-Plugin, um passende Laufzeitimages zu generieren.
Maven Build einrichten
Ausgangspunkt ist dafür das Projekt aus JavaFX unter Java 11 - Ohne JPMS.
Dieses bindet bereits die nötigen Dependencies ein und verfügt über ein startbares Programm.
Allerdings braucht es das maven-assembly-plugin nicht mehr, dieses muss mit dem javafx-maven-plugin ersetzt werden,
welches das Laufzeitimage baut.
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<mainClass>de.ybroeker.blog.javafx.demo.JavafxMain</mainClass>
<release>11</release>
<jlinkImageName>${artifactId}</jlinkImageName>
<launcher>launcher</launcher>
</configuration>
<executions>
<execution>
<id>applications</id>
<phase>package</phase>
<goals>
<goal>jlink</goal>
</goals>
</execution>
</executions>
</plugin>
Außerdem ist die zusätzliche main nicht mehr nötig, stattdessen kann die übliche main-Methode genutzt werden.
module-info
Um das Modulsyste zu nutzen (und so das Bauen eines Laufzeitimages zu ermöglichen), muss das Projekt eine module-info.java enthalten.
In dieser wird das Modul deklariert und benötigte Module und exportierte Packages angegeben.
Für dieses einfach Beispiel werden javafx.controls und javafx.fxml benötigt, werden also mit requires angegeben.
Außerdem braucht die JavaFX-Runtime Zugriff auf die Application und Controller der Anwendung, die entsprechenden Packages müssen also exportiert werden.
module de.ybroeker.blog.javafx.demo {
requires javafx.controls;
requires javafx.fxml;
exports de.ybroeker.blog.javafx.demo;
}Bauen und starten
Bauen lässt sich das Projekt wie üblich mit mvn package, danach enthält der target-Ordner in javafx_demo die Anwendung inklive der Laufzeitumgebung.
Zum Starten nutzt man das launcher-Skript in bin/, ruft man dieses auf (mit ./target/javafx-demo/bin/launcher), startet die Anwendung:

Source
Der Code findet sich bei Github: github.com/ybroeker/blog-javafx-demo-jlink