IntelliJ形式のJavaFXプロジェクトをJavaFX 11にアップグレードしたら色々ハマった話

このエントリは じゃばえふえっくす Advent Calendar 2018 の 2 日目のエントリとして作成しました。場所がたくさん空いてるので、みんなも気軽に参加してねー。

さて今回は 1 日目 として書いた記事で次の様なことを書いていたのですが、その内容について触れたいと思います。

Java 11 から JavaFXJava の 1 ライブラリになりましたが、Mavenリポジトリにも "org.openjfx" というグループ名でアーティファクトが登録されました。

https://mvnrepository.com/artifact/org.openjfx

モジュール別にアーティファクトが登録されています (実はこれを利用する際にちょっとした罠にはまったのですが、それは別のエントリで) 。

IntelliJ プロジェクトからこの Maven リポジトリを利用しようとした際に罠にはまりました。まあ、純粋な IntelliJ 形式のプロジェクトで開発している人は少ないと思うのですが、OpenJFX の Maven リポジトリの解説にもなるので、独立したエントリとしました。

IntelliJ プロジェクトを JDK11 にアップする

まず、既存の JDK10 を利用するプロジェクトとして作成した IntelliJ プロジェクトを JDK11 にアップしてみます。 f:id:aoe-tk:20181223231936p:plain

JDK11 には JavaFX は入っていません。当然このように JavaFX 関連の API が赤くなってしまいます。悲しい。 f:id:aoe-tk:20181223232110p:plain

IntelliJ から Maven を利用したライブラリ設定を行う

嘆いていても仕方ないので、JavaFX のライブラリ設定を行うことにします。IntelliJ には依存するライブラリを Maven リポジトリから取ってくる機能があるので、これを利用して MavenCentral に登録された OpenJFX のライブラリを取ってくることにします。 f:id:aoe-tk:20181223232358p:plain

次のように MavenCentral からアーティファクトを検索してくれます。 f:id:aoe-tk:20181223232733p:plain

これでエディタから赤色が無くなる...と期待したのですが無くなりませんでした! Maven からダウンロードした OpenJFX の JAR の中身を見ると MANIFEST ファイルしか置いていないのです!

Maven リポジトリへの OpenJFX JAR の配置について

どうしてこうなったのかは Mavenリポジトリの内容を見て分かりました。OpenJFX は OS 別のネイティブ実装を含むため、OS 別に JAR ファイルが用意されていたのです。例えば javafx-controls モジュールのリポジトリ を覗いてみると次のようになっています。 f:id:aoe-tk:20181223233303p:plain

WindowsMacLinux 向けに artifact classifier を使って JAR が分けられています。色々調べましたが、IntelliJ では artifact classifier で細分化された JAR を取ってくることができませんでした。しくしく。

普通に OpenJFX SDK をダウンロードして利用する

仕方が無いので古き良きライブラリ直接ダウンロードという方法を採ることにします。なお、今回対象としたプロジェクトは一応 GitHub に公開しており、また自分自身 WindowsMac の両方で使うようにしていたので、環境依存的な設定が入ることを避けるようにします。

ダウンロードは前回のエントリで紹介した かっこいい Web サイト からできます。実行する環境に利用する OS のものを選んでダウンロードして解凍します。なお、IntelliJ はホームディレクトリ以下のパス設定は自身の環境変数を使って設定に記述するので、どの OS でもホームディレクトリの下のディレクトリに解凍すると環境依存が無くなるのでお勧めです。

ダウンロード、解凍が終わったら IntelliJ からこれを利用するように設定します。プロジェクト設定の [Libraries] から普通に [Java] を選んで、先ほどダウンロードした OpenJFX SKD ディレクトリの lib サブディレクトリを選択します。 f:id:aoe-tk:20181223234407p:plain f:id:aoe-tk:20181223234430p:plain

これでエディタから赤色が消えました。が、これで終わりではありませんでした。OpenJFX SKD の lib ディレクトリの下にはソースコードアーカイブした src.zip が置かれています。そのままでは IntelliJ がこれもコンパイル対象にしようとして、ビルド時にエラーになってしまいました...。

そこで、lib ディレクトリの下にある src.zip ファイルを別の場所に移動し、さらに IntelliJ のライブラリ設定からソース参照の設定 (次の図で赤色で囲っている部分) を除去します。 f:id:aoe-tk:20181223234818p:plain

これで無事にビルドもできるようになりました。やれやれ。

忘れてはいけない実行時の注意点

さて、実際に実行する際にも注意点があります。これは IntelliJ 固有の話では無く、Java 11 以降の JavaFX アプリケーション実行時の共通した注意点です。

詳細については id:torutk さんの次のエントリで解説されていますが、Main クラスが javafx.application.Application を継承している場合、実行時に --add-modules による JavaFX モジュールの指定が必須です。

torutk.hatenablog.jp

また、アプリケーション自体をモジュール化している場合は実行時にモジュールパスの指定も必要になります。次のように実行設定を編集して、必要なパスの設定を忘れないでください。 f:id:aoe-tk:20181223235428p:plain f:id:aoe-tk:20181223235621p:plain

以上です。えっと結論としては素直に Maven か Gradle で開発プロジェクトを作りましょう、ですw 今はどの IDE もこれらのツールで作ったプロジェクトならそのまま取り込めるので *1 、一見面倒そうに見えても後がすごく楽です。

*1:NetBeans の最新版だけ Gradle プラグインの対応が遅れていたかも...