Posted at

JavaFXアプリをJava8/11両方で動くjarファイルに固める


結論


  • 各プラットフォーム向け OpenJFX 11 ライブラリをすべて含む fat jar を生成する.


JavaFX (Java 11から非同梱)

JavaFXは,JVM上で動作するクロスプラットフォームなGUIライブラリです.が,Java 11からライブラリが同梱されなくなり,かわりにOpenJFXとして外部ライブラリ化されました.

ここで悩ましいのは「どのJavaバージョンに対応するか?」です.Java 11に対応したいものの,Java 8を簡単に切り捨てるわけにはいきません(個人ユーザへのOracleの無償アップデート提供は2020年末まで続く).


Java8/11 両方で動かす fat jar

この悩みを解決するのが fat jar で,端的に言えば OpenJFX 11 ライブラリを jar ファイルにすべて含めてしまいます.

詳細は Getting Started with JavaFX 11 > Runtime images > Non-Modular project に記載がありますが, Gradle だと(通常のjarタスクの設定に加えて)下記のような指定を追加します.


build.gradle

compileOnly "org.openjfx:javafx-graphics:$javafx.version:win"

compileOnly "org.openjfx:javafx-graphics:$javafx.version:linux"
compileOnly "org.openjfx:javafx-graphics:$javafx.version:mac"

そしてJDK11でビルドすると, Java8/11 両方で動く fat jar が出来上がります.