web-dev-qa-db-ja.com

Maven Shade JavaFXランタイムコンポーネントがありません

Maven依存関係を使用して、JFX11自己完結型jarを作成しようとしています。私が行った研究から、これを行う最良の方法は、Maven Shadeプラグインを使用することであると思われます。ただし、実行すると、次のエラーが表示されます。

エラー:JavaFXランタイムコンポーネントが見つからないため、このアプリケーションを実行する必要があります

なぜこれが起こっているのか分かりません。私は何を台無しにしていますか?これを行うためのより良い方法はありますか?同じメッセージでmaven Assemblyプラグインも試しました。

参照用のPOMファイル

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Application</groupId>
    <artifactId>Main</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpaceRunner</name>
    <url>http://maven.Apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>10</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>Application.Main</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>
                                Application.Main
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>Application.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
22
Bitclef

これは answer JavaFX 11でfat/uber jarが失敗する理由を説明しています。

このエラーは、Java.baseモジュールのSun.launcher.LauncherHelperから発生します。これは、メインアプリがアプリケーションを拡張し、メインメソッドを持っているためです。その場合、LauncherHelperはjavafx.graphicsモジュールが名前付きモジュールとして存在することを確認します。そのモジュールが存在しない場合、起動は中止されます。

そしてすでにGradleの修正を提案しています。

Mavenの場合、ソリューションはまったく同じです。Applicationから拡張されない新しいメインクラスを提供します。

applicationパッケージに新しいクラスがあります(名前が間違っています):

// NewMain.Java
public class NewMain {

    public static void main(String[] args) {
        Main.main(args);
    }
}

既存のMainクラス、そのまま:

//Main.Java
public class Main extends Application {

    @Override
    public void start(Stage stage) {
        ...
    }

    public static void main(String[] args) {
        launch(args);
    }
}

次に、pomを変更し、さまざまなプラグインのメインクラスを設定する必要があります。

<mainClass>application.NewMain</mainClass>

プラットフォーム固有のFat jar

最後に、シェードプラグインを使用して、ファットjar on your machineを生成します。

これは、これまでのところ、JavaFX依存関係が一意の分類子を使用していることを意味します。たとえば、Windowsを使用している場合、Mavenはwin分類子を内部的に使用します。これには、Windowsのネイティブライブラリのみを含める効果があります。

だからあなたは使用しています:

  • org.openjfx:javafx-controls:11
  • org.openjfx:javafx-controls:11:win
  • org.openjfx:javafx-graphics:11
  • org.openjfx:javafx-graphics:11:win <-これにはWindows用のネイティブdllが含まれます
  • org.openjfx:javafx-base:11
  • org.openjfx:javafx-base:11:win

これで、ファットjarを作成する場合、それらの依存関係(およびプロジェクトからの他の通常のサードパーティの依存関係)をすべてバンドルし、プロジェクトを次のように実行できるようになります。

Java -jar myFatJar-1.0-SNAPSHOT.jar

これは非常に便利ですが、jarを配布する場合は、このjarがnot cross-platformであり、ご使用のプラットフォーム(この場合はWindows)でのみ機能することに注意してください。

クロスプラットフォーム脂肪ジャー

配布可能なクロスプラットフォームjarを生成するソリューションがあります。他のプラットフォームの残りのネイティブライブラリを含めます。

3つのプラットフォームのグラフィックモジュールの依存関係を含めるだけでよいため、これは簡単に実行できます。

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>win</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>linux</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>mac</classifier>
    </dependency>
</dependencies>

サイズ

このアプローチには主な問題があります:サイズです。この他の answer でわかるように、WebViewコントロールを使用すると、WebKitネイティブライブラリのために約220 MBがバンドルされます。

44
José Pereda