JavaFXアプリケーション開発にはLiberica JDKがオススメ

私はこれまで JavaFX アプリケーションの開発に Oracle OpenJDK Gluon JavaFX の組み合わせを使ってきました。JDK OpenJFX をマージするバッチファイルを作ったりもしました。

でも そんな手間を掛ける必要はなかったんです。はじめから OpenJFX がバンドルされている OpenJDK ディストリビューションを使えば済む話だったのです。OpenJFX をバンドルしている OpenJDK それが Liberica JDK です。

OpenJDK で多様性が生まれた

私は昨年まで Oracle による JDK の有償化によって Java は勢いを失ってしまうのではないかと心配していました。しかし それは杞憂でした。

Oracle JDK の有償化以降 様々なディストリビューターが OpenJDK を配布するようになり 以前よりも好ましい状況になったと思います。Oracle Java の商用機能をすべて OpenJDK に移管してくれたことも素晴らしいです。もし Oracle Oracle JDK OpenJDK で機能の差別化を図っていたら このような OpenJDK の盛り上がりはなかったかもしれません。

OpenJDK の多様化で 私がもっとも嬉しく思えたのは 32 ビット Windows 用の Java が復活したことです。Oracle Java 9 以降 32 ビット Windows 用の Java を配布しなくなってしまいました。しかし AdoptOpenJDK Liberica JDK などいくつかの OpenJDK ディストリビューションによって再び 32 ビット Windows 用の Java が利用できるようになったのです。それも Java の最新バージョンで!

他にも AdoptOpenJDK IBM 由来の OpenJ9 という Hotspot ではない JavaVM を搭載していたり Liberica JDK ZuluFX はディストリビューションに OpenJFX をバンドルしていたり ディストリビューションごとの特色が出ています。

自分に合った JDK を自由に選べる すてきですよね。

用途によっても変わってくるとは思いますが JavaFX アプリケーション開発には Liberica JDK がもっとも適していると私は感じました。私が Liberica JDK を推す理由を説明していきましょう。

JavaFX は単なるライブラリではない

JavaFX は単なるライブラリとして使えばいい JavaFX がバンドルされた JDK に対して否定的なことを言う人もいます。

それは違います。

JavaFX は単なるライブラリではないのです。JavaFX はとても多くのネイティブ ライブラリと共にあります。JavaFX は非常にプラットフォーム依存性が高く プラットフォーム間の差異を吸収するためのレイヤー すなわちランタイム環境でもあります。位置付けとしては JRE に近いです。

実際に OpenJFX OpenJDK の組み合わせによって正しく動作しないケースが発生しており OpenJFX OpenJDK それぞれのパッケージを選択する際には 2 つの相性に問題がないかを気に掛けなければなりません。

一例を挙げましょう。Windows の場合 Gluon JavaFX 11.0.1 AdoptOpenJDK 11.0.1 を組み合わせると正しく動作しません。Gluon JavaFX 11.0.1 Oracle JDK 11.0.1 または Oracle OpenJDK 11.0.1 の組み合わせは問題なく動作しました。その原因は VC++ランタイムのバージョン不一致にありました。以下 Windows に限ったお話です

Gluon JavaFX 11.0.1 VC++ 14.0 ランタイムに依存するようにビルドされています。Oracle JDK 11.0.1 Oracle OpenJDK 11.0.1 VC++ 14.0 ランタイムに依存するようにビルドされており これらの組み合わせでは問題は生じません。

しかし AdoptOpenJDK 11.0.1 VC++ 12.0 ランタイムに依存するようにビルドされていました。これが原因で VC++ 14.0 ランタイムを必要とする Gluon JavaFX が動作しない状況が生まれてしまいました。

Java のモジュール jmod にはネイティブ ライブラリを含めることもできるのですが 何故か Gluon JavaFX モジュール javafx.graphics.jmod VC++ 14.0 ランタイムを含めていないのです。javafx.graphics.jmod vcruntime140.dll を含んでいれば VC++ 12.0 に依存する AdoptOpenJDK 11.0.1 との組み合わせでも問題なく動作するのに です。

 javafx.graphics.jmod VC++ランタイムも入れたほうがいいですよ
 java.base VC++ランタイム入っているから要らんやろ

というわけです。つまり OpenJFX OpenJDK が同じバージョンの VC++ランタイムに依存していることを期待しているのです。その期待を裏切ってしまった AdoptOpenJDK 11.0.1 との組み合わせでは正しく動作しないという不幸を招きました。

補足
AdoptOpenJDK 11.0.4 は依存する VC++ランタイムが 14.0 になっていましたので 最新の Gluon JavaFX AdoptOpenJDK の組み合わせは問題なく動作します。しかし この状況がずっと続く保証はありません。どちらか一方だけが依存する VC++ランタイムのバージョンを上げてしまったら 再び同じ問題が発生するはずです。

OpenJDK OpenJFX は依存するライブラリのバージョンが同じであることを気にしなければならないくらい密接な関係にあります。それなら OpenJFX がバンドルされている OpenJDK ディストリビューションを選択するほうが簡単です。そうすれば 依存ライブラリのバージョンが異なるという相性問題は確実に回避できるのですから。

Gluon JavaFX

私が 単体配布されている OpenJFX を好まない理由はもう 1 つあります。私を満足させてくれる OpenJFX 単体配布ディストリビューターが見つからないのです。

私が知っている OpenJFX 単体配布ディストリビューターは Gluon 唯一つです。

OpenJFX バイナリを配布してくれている Gluon は素晴らしいと思います。でも お金の匂いも感じてしまって少しモヤっとしてしまうのです。

Gluon JavaFX のパッケージは Public version LTS version 2 つに分かれています。Public version は無償でダウンロードできますが 最新のマイナーアップデートは提供されません。LTS version は最新のマイナーアップデートが提供されるようですが お問い合わせください となっています。おそらく LTS version は有償なのだと思います。

JavaFX 11 の場合 11.0.2 までは無償ダウンロード可能 11.0.3 以降は お問い合わせください となっています。12.0.1 も無償でダウンロードできるので 最新版を追い続けるなら Public version でも困らないでしょう。メジャーバージョンは 11 に固定してマイナーアップデートは受け取りたいといった場合は LTS version お問い合わせかな?

また Gluon JavaFX では 32 ビット Windows 用のパッケージは公開されていません。32 ビット版が必要な方は お問い合わせください となっていますので おそらく…。

Liberica JDK

Gluon JavaFX にやきもきとしていたときに知ったのが Liberica JDK です。Liberica JDK OpenJFX をバンドルしている OpenJDK ディストリビューションの 1 つです。

Windows Linux macOS だけでなく Solaris ARM アーキテクチャ Linux 版まで配布している幅広さ。さらに Windows Linux 64 ビット版だけでなく 32 ビット版まで配布。さらにさらに LTS 長期サポート バージョンをタイムリーにリリース。Java 11.0.2 で打ち止めになることなく Java 11.0.4 がリリースされています。2019 7 月現在

さらにさらにさらに Java 12 も配布してくれています。Java 11 LTS を長く使いたい人も Java 12 Java 13…と最新を追いかけたい人も Liberica JDK なら安心ですね。

Liberica JDK の存在を知っていたら JDK OpenJFX をマージするバッチファイルなんて作らなかったのに! そう思えるほど魅力的な OpenJDK ディストリビューションです。

Zulu Community

Azul Systems が配布している OpenJDK です。

以前は ZuluFX Zulu Community 2 つに分かれていたのですが 2019 7 月末に Zulu Community に統合されたようです。Zulu Community のパッケージが JDK / JRE / JDK FX / JRE FX 4 種類になり JavaFX の有無を選択できるようになりました。

ただし JDK FX / JRE FX パッケージが提供されるのは Java 8 Java 11 のみで Java 12 には JDK FX / JRE FX パッケージはありませんでした。JavaFX を同梱したパッケージは Oracle LTS のみ追従する感じでしょうか。

JavaFX を同梱した JRE を配布しているのは Zulu Community だけかもしれません。

Amazon Corretto

Amazon Corretto Amazon が配布する OpenJDK ディストリビューションです。発表時には JavaFX をサポートすると言っていたのですが それは Amazon Corretto 8 Java 8 だけの話だったみたいです。Amazon Corretto 11 Java 11 には JavaFX が同梱されておらず残念。

この記事を共有しませんか?