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>
これは 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のネイティブライブラリのみを含める効果があります。
だからあなたは使用しています:
これで、ファット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がバンドルされます。