java - started - openjfx platform



Maven Shade JavaFXランタイムコンポーネントが欠落しています (1)

私はMavenの依存関係を使用してJFX11自己完結型jarを作成しようとしています。 私が行った調査によると、これを行うための最良の方法はMaven Shadeプラグインを使用することです。 しかし、実行するとこのエラーになります。

エラー:JavaFXランタイムコンポーネントが欠落しており、このアプリケーションを実行するために必要です

なぜこれが起こっているのか理解できません。 私は何をめちゃくちゃにしていますか? これを行うより良い方法はありますか? 私はまた同じメッセージでMavenアセンブリプラグインを試してみました。

参照用の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>

https://src-bin.com


Answer #1

この answer は、JavaFX 11で太ったjarが失敗する理由について説明します。

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

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

Mavenの場合、解決策はまったく同じです。Applicationから継承されない新しいメインクラスを提供し 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>

プラットフォーム固有のファットジャー

最後に、shadeプラグインを使って、 あなたのマシン上で 太い瓶を作り ます

つまり、これまでのところ、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ファイルはクロスプラットフォームではなく、自分のプラットフォーム、この場合は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がバンドルされます。





javafx-11