簡體   English   中英

在模塊路徑上使用OpenJFX 11 JMODS在JDK 11上運行javafx示例

[英]Running javafx sample on JDK 11 with OpenJFX 11 JMODS on Module Path

我從OpenJFX項目下載了JavaFX Jmod文件,並將它們放在目錄G:\\openjfx\\javafx-jmods-11 我正在使用OpenJDK 11,它在JAVA_HOME/jmods沒有JavaFX jmod,即它沒有JavaFX發行版。

模塊信息文件:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}

我編譯如下:

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.java src\gui\module-info.java

編譯成功。 但是我無法使用以下命令運行已編譯的代碼:

java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo

但我得到以下錯誤:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found, required by gui

我相信您所面臨的錯誤有一個解釋: jmods不能在運行時使用

這在這里解釋: http//openjdk.java.net/jeps/261#Packaging : -JMOD-files

JMOD文件可以在編譯時和鏈接時使用,但不能在運行時使用。 為了在運行時支持它們,通常需要我們准備好即時提取和鏈接本機代碼庫。

並且歸功於這個答案

所以我做了一些簡單的模塊hellofx

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

HelloFX從樣品這里並下載JavaFX的11 jmods我的平台, 在這里 我還從同一個位置下載了JavaFX 11 SDK(jars)。

編譯時間

在編譯時,我們可以使用jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.java")

或者使用SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.java")    

在這兩種情況下,結果都與預期完全相同:在編譯期間不需要本機庫。

運行

現在我們要運行我們的小模塊。

正如OP所述,使用jmods運行:

java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX   

失敗了:

Error occurred during initialization of boot layer
  java.lang.module.FindException: Module javafx.controls not found, required by hellofx

但使用SDK,有效:

java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX

鏈接時間

正如JEP-261所述,jmods在鏈接時也能正常工作,所以我們可以在編譯時和運行時之間使用jlink工具。

您可以使用jlink工具將一組模塊及其依賴項組合和優化到自定義運行時映像中。 來源

我們這樣做:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links

這將生成一個90.7 MB的文件夾(在我的Mac上)。 請注意, lib文件夾包含來自Java 11和JavaFX 11的所有必需的本機庫,以及一個名為modules的70.5 MB文件。

運行時間(2)

我們終於可以做到:

links/bin/java -m hellofx/hellofx.HelloFX

這將有效。

總之,如果我們想只能使用編譯和運行我們的模塊jmods,我們需要給一個額外的步驟jlink 否則,對於運行時,我們需要JavaFX SDK。

如果沒有自動添加它,請嘗試在pom.xml中使用此設置。 一定要改變“!!你的主要密碼!” 使用main方法將代碼底部轉移到類的名稱! 如果我的類是Example.java,我將只想放入Example。

 <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不會自動添加為Java 11的依賴項。這就是我們需要手動添加的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM