web-dev-qa-db-ja.com

モジュールパスでOpenJFX 11 JMODSを使用してJDK 11でjavafxサンプルを実行する

OpenJFXプロジェクトからJavaFX Jmodファイルをダウンロードし、G:\openjfx\javafx-jmods-11ディレクトリに配置しました。 Java_HOME/jmodsにJavaFX jmodがないOpenJDK 11を使用しています。つまり、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
12
MohamedSanaulla

あなたが直面しているエラーの説明があると思います:jmodsは実行時に使用できません

これはここで説明されます: http://openjdk.Java.net/jeps/261#Packaging:-JMOD-files

JMODファイルはコンパイル時とリンク時に使用できますが、実行時は使用できません。実行時にそれらをサポートするには、一般に、ネイティブコードライブラリをその場で抽出およびリンクする準備が必要です。

クレジットはこれになります answer

簡単なモジュールhellofxを作成しました:

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

hereHelloFXサンプルを使用し、 here からプラットフォームのJavaFX 11のjmodをダウンロードしました。また、同じ場所からJavaFX 11 SDK(jar)をダウンロードしました。

コンパイル時間

コンパイル時に、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で述べられているように、jmodはリンク時にも機能するため、コンパイル時間と実行時間の間に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

そして、それは動作します。

結論として、モジュールのコンパイルと実行にjmodのみを使用する場合は、jlinkを使用して追加の手順を実行する必要があります。それ以外の場合、ランタイムにはJavaFX SDKが必要です。

17
José Pereda

自動的に追加されない場合は、pom.xmlでこのセットアップを使用してみてください。必ず「!! YOUR MAIN CLASSNAME HERE !!」を変更してくださいコードの下部に向かって、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の依存関係として自動的に追加されません。そのため、手動で追加する必要があります。

0
Searjasub