it-swarm.com.de

Ausführen von javafx sample auf JDK 11 mit JMODS von OpenJFX 11 auf dem Modulpfad

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
7
MohamedSanaulla

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.

11
José Pereda

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.

0
Searjasub