Ich habe die JavaFX Jmod-Dateien aus dem OpenJFX-Projekt heruntergeladen und in das Verzeichnis G:\openjfx\javafx-jmods-11
gestellt. Ich verwende OpenJDK 11, das kein JavaFX-jmod in Java_HOME/jmods
enthält, d.
Modul-Infodatei:
module gui{
requires javafx.graphics;
requires javafx.controls;
exports com.test;
}
Ich kompiliere mit folgendem:
javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src
src\gui\com\test\*.Java src\gui\module-info.Java
Kompilierung gelingt. Ich kann den kompilierten Code jedoch nicht mit dem folgenden Befehl ausführen:
Java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo
Aber ich bekomme den folgenden Fehler:
Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.graphics not found, required by gui
Ich glaube, dass es eine Erklärung für den Fehler gibt, dem Sie begegnen: jmods kann nicht zur Laufzeit verwendet werden.
Dies wird hier erklärt: http://openjdk.Java.net/jeps/261#Packaging:-JMOD-files :
JMOD-Dateien können zur Kompilierzeit und zur Verbindungszeit verwendet werden, jedoch nicht zur Laufzeit. Um sie zur Laufzeit zu unterstützen, müssten wir generell bereit sein, native Code-Bibliotheken im Handumdrehen zu extrahieren und zu verknüpfen.
und Kredit geht an diese Antwort .
Also habe ich ein einfaches Modul hellofx
gemacht:
module hellofx {
requires javafx.controls;
exports hellofx;
}
mit dem HelloFX
-Beispiel aus hier und die jmods für JavaFX 11 für meine Plattform von hier heruntergeladen. Ich habe auch JavaFX 11 SDK (Jars) vom selben Speicherort heruntergeladen.
Kompilierzeit
Zur Kompilierzeit können wir dies mit jmods tun:
javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.Java")
oder mit SDK:
javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.Java")
In beiden Fällen ist das Ergebnis erwartungsgemäß genau das gleiche: Native Bibliotheken sind während der Kompilierungszeit nicht erforderlich.
Laufzeit
Nun wollen wir unser kleines Modul ausführen.
Mit jmods, wie vom OP angegeben, wird Folgendes ausgeführt:
Java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX
schlägt fehl mit:
Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.controls not found, required by hellofx
Mit dem SDK funktioniert es jedoch:
Java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX
Linkzeit
Wie im JEP-261 angegeben, funktionieren jmods auch zur Verbindungszeit, sodass wir das jlink
-Tool zwischen Kompilierzeit und Laufzeit verwenden können.
Mit dem jlink-Tool können Sie einen Satz von Modulen und ihre Abhängigkeiten zu einem benutzerdefinierten Laufzeitabbild zusammenstellen und optimieren. ( Quelle )
Also lass uns tun:
jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
dadurch wird ein Ordner mit 90,7 MB (auf meinem Mac) erstellt. Beachten Sie, dass der Ordner lib
alle erforderlichen systemeigenen Bibliotheken von Java 11 und von JavaFX 11 sowie eine 70,5 MB-Datei mit dem Namen modules
enthält.
Laufzeit (2)
Und wir können endlich tun:
links/bin/Java -m hellofx/hellofx.HelloFX
Und das wird funktionieren.
Wenn wir zum Kompilieren und Ausführen unserer Module nur jmods verwenden möchten, müssen wir mit jlink
einen zusätzlichen Schritt geben. Ansonsten benötigen wir zur Laufzeit das JavaFX-SDK.
Wenn es nicht automatisch hinzugefügt wird, versuchen Sie es mit diesem Setup in der pom.xml. Stellen Sie sicher, dass Sie "!! IHR HAUPTKLASSENNAME HIER !!" am Ende des Codes zum Namen Ihrer Klasse mit der Hauptmethode! Wenn meine Klasse Example.Java ist, möchte ich dort nur Example einfügen.
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>Java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
</configuration>
</plugin>
</plugins>
</build>
JavaFX wird bei Java 11 nicht automatisch als Abhängigkeit hinzugefügt. Deshalb müssen wir es manuell hinzufügen.