Oracle は、先月(米国時間の 2018 年 9 月 25 日)に Java SE 11 / JDK (Java Development Kit) 11 の一般提供を開始しましたが、このリリースから JavaFX のパッケージが削除されてしまいました [1]。JavaFX でちょっとした GUI プログラムを作って業務にも使っていたので、しばらくは JDK 11 に移行せずに古い JDK を使い続けるしかないかなと思っていました。
しかし、JDK 11 がリリースされる一週間前の 9 月 18 日 (UTC) に、単独で JavaFX 11 がリリースされていたのでした [2]。JavaFX に関する情報収集に精を出していなかったせいもあって、JavaFX 11 の存在に気が付い時にはリリースから一カ月近くが経過していました💦。実は Java 11 のリリースノート [1] には、この JavaFX 11 についての情報も記載されていたのですが…、リリース・モデル [3] の変更についての話題に気を取られ、全然読んでいませんでした。
しかしこれで NetBeans 9.0 で JavaFX のアプリケーションのビルドができると意気込み、悪戦苦闘したものの、なんとか、こつこつ作っている JavaFX のアプリケーションのビルドに成功したのでした。そのアプリケーションは紹介できないので、テスト用にバージョンを確認する小さな JavaFX プログラムのスクリーンショットを載せました。
目的と Linux の使用環境
今回の目的は、Java 8 で利用していた JavaFX のプロジェクトを、Java 11 の環境へ移行することです。ただし、Netbeans 9.0 を開発環境に使っている場合に限定します。移行するサンプルとして JavaVersion という簡単なプロジェクトを使います。この記事の終わりにコードを紹介しています。
自宅で Linux 環境でも同じように Java 11 へ移行して、JavaFX 11 を利用できるかどうか確認しました。Fedora 29 beta から OpenJDK 8 と 11 を共存させていたのですが、OpenJDK 8 の方を完全に削除しました。使用環境は以下の通りです。
- OS: Fedora 29 beta (x86_64)
- IDE: Apache NetBeans IDE 9.0 (Build incubator-netbeans-release-334-on-20180708)
- java-11-openjdk-11.0.0.28-1.fc29.x86_64
- java-11-openjdk-devel-11.0.0.28-1.fc29.x86_64
- java-11-openjdk-headless-11.0.0.28-1.fc29.x86_64
- java-11-openjdk-javadoc-11.0.0.28-1.fc29.x86_64
- java-11-openjdk-src-11.0.0.28-1.fc29.x86_64
Wayland に未対応
JavaFX 11 のリリースノート [4] を読むと、Ubuntu 18.04 で Wayland のウィンドウサーバーを有効にすると JavaFX 11 がクラッシュするとあります。これは、このバージョンから JavaFX のコードが GTK 3 へ移行したことに原因があるようです。これは Ubuntu 固有の問題ではなく、Fedora でも確認できました。
これを回避する方法として次の二点が紹介されています。
- Wayland を使わず Xorg を使う。
- 強制的に GTK 2 を使う。java -Djdk.gtk.version=2 ...
将来この問題が GTK 3 の環境下で解決されることを期待して、ひとまずログイン時にデフォルトの Wayland ではなく、Xorg を明示的に指定 (GNOME on Xorg) して対応することにします。
※ これからの説明は、参考サイト [5] の内容を確認し、自分の環境に合わせて書き直したものです。
JavaFX 11 のダウンロードとライブラリの登録
参考サイト [6] から、JavaFX Linux SDK (openjfx-11_linux-x64_bin-sdk.zip) をダウンロードして、適当なディレクトリに展開します。私は、ホームディレクトリ内に lib ディレクトリを用意しておいて、その中に展開しています。
Netbeans を起動して、メニューバーから Tools → Libraries を選び、Ant Library Manager ダイアログの画面左下の New Library ... ボタンをクリックして、展開しておいた /home/bitwalk/lib/javafx-sdk-11/lib/ 内の jar ファイルを選択して JavaFX という名前を付けてライブラリに登録しておきます。
Netbeans 9.0 で JavaFX のプロジェクトは作れない
JDK 11 には JavaFX 11 の SDK が含まれていないので当然ですが、Netbeans 上で JavaFX プロジェクトを作成することはできません。
Netbeans 9.0 でモジュール用プロジェクト ModuleTest を作成
メニューバーから Files → New Project... を選び、New Project のダイアログ画面の Choose Project のステップにおいて Categories のリストから Java、Projects のリストから Java Modular Project を選択して Next > ボタンをクリックします。
Name and Location ステップで、プロジェクト名などの設定をします。ここでは Project Name を ModuleTest として Finish ボタンをクリックしてプロジェクトの作成を完了します。
ここでは、今まで Java のバージョンを表示する JavaFX のプロジェクト JavaVersion を新しく作成したモジュール用プロジェクトにコピーするため、プロジェクトのペインに表示しています。JavaVersion が赤字になっているのは、この環境ではエラーがあってビルドできないからです。
JavaFX ライブラリの追加
さて、作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。
左側の Categories から Libraries を選び、右側の Compile タブを表示します。Compile-time Libraries で Modulepath の行右側の + ボタンをクリックして、メニューから Add Library... を選びます。
Add Library のダイアログで、あらかじめ登録しておいた JavaFX を選択して Add Library ボタンをクリックして追加します。
Modulepath に JavaFX ライブラリが追加されたことを確認してから OK ボタンをクリックして Project Properties - ModuleTest のウィンドウを閉じます。
モジュールの作成
次に、再度作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、New → Module を選択して新しいモジュールを作成します。
ここでは Module Name を javafxApp として Finish ボタンをクリックします。
するとモジュール定義ファイル module-info.java がクラスディレクトリ ModuleTest/src/javafxApp/classes のトップに生成されて、右側のエディタのペインに表示されます。
生成された module-info.java には、以下のように依存するモジュールと公開するモジュールを記述します。
記述後の module-info.java は以下のようになります。
以前のプロジェクトで利用していたパッケージを ModuleTest プロジェクトへコピーします。
メインプロヘクト、メインクラスの指定とコンパイル、実行
メニューバーから Run → Set Main Project から ModuleTest を選んでメインプロジェクトに設定します。
再び、左側のプロジェクトのペインで ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。左側の Categories から Run を選び、右側の Main Class のエントリに起動するメインクラス javaversion.JavaVersion を入力して OK ボタンをクリック、プロパティ画面を閉じます。
キーボード F6 を押して、プロジェクトをコンパイル、実行します。
JavaVersion プロジェクトのソースコード
ご参考までに、今回使用した JaveVersion プロジェクトのソースコードとイメージを紹介しておきます。
参考サイト
- JDK 11 Release Notes, Important Changes, and Information
- JavaFX 11がリリース - クロスプラットフォームのGUIライブラリ | ソフトアンテナブログ
- JDKの新しいリリース・モデル、および提供ライセンスについて
- openjdk-jfx/release-notes-11.md at jfx-11 · javafxports/openjdk-jfx
- netbeans - JavaFX deployment library not found in active JDK - Stack Overflow
- JavaFX - Gluon
- JavaFX (https://openjfx.io/)
- bitWalk's: Apache NetBeans 9.0
にほんブログ村