タグ「Scene Builder」が付けられているもの

この記事は JavaFX Advent Calendar 2015 の 3 日目です。昨日は @boochnich さんの「JavaFXで作ったアナログ時計にタッチパネル操作を追加してみた際のメモ」です。

同様の内容の記事は既に書いているのですが、かなり雑な書き方だったので、今回はちゃんと書きます。

Oracle から JavaFX Scene Builder のバイナリ配布が行われなくなって久しいですが、現在は Gluon が実行可能 JAR と各プラットフォーム向けインストーラのバイナリ配布を行っています。それ自体は非常にありがたいのですが、Windows 向け EXE インストーラ版を用いると、Surface Pro をはじめとする HiDPI 環境でウィンドウが潰れて表示されてしまいます。Surface Pro の場合は拡大率 150% のため、毎回手動でレイアウトを整えればまだ使えます。しかし、筆者が自宅で使用している LaVie (2560×1440) は拡大率が 200% であり、さすがに操作に支障をきたします。Windows でも JDK 8 Update 60 以降では JavaFX の HiDPI 対応がなされているため、最新の JRE と実行可能 JAR 形式の Scene Builder を組み合わせて使用すれば、解像度に関わる問題は解決します。ただし、手軽に使える EXE インストーラ版は同梱の古い JRE 上で動作するため、さすがにお手上げです。

一番楽な方法は素直に実行可能 JAR 形式で利用することです。ただ、筆者はこの件についてなぜか納得がいかないので、自分で MSI と EXE のインストーラを作ってみることにしました。今回はそのレシピのご紹介です。繰り返しになりますが、実行可能 JAR で納得のいく方は真似をしないでください。

JDK には javapackager というツールが含まれており、Java SE アプリケーションをインストーラ形式にパッケージすることができます。Windows の MSI および EXE 形式、Mac の DMG 形式、Linux の RPM 形式がサポートされます。古い JDK には javafxpackager という JavaFX 専用のパッケージツールが含まれていましたが、javapackager はその後継となるものです。

さて、今回やりたいことの本質は単純で、javapackager で実行可能 JAR 形式の Scene Builder をパッケージして、MSI または EXE 形式のインストーラを作成することです。ただし、事前準備が必要になります。javapackager はそれ自身インストーラを作成する機能を持たず、外部のインストーラ作成ツールを呼び出します。そして不幸なことに、Windows にはインストーラを作成するツールは含まれていません。

Case 1. MSI 形式インストーラ

MSI 形式は "Program Files" 以下にアプリケーションをインストールするもので、作成には WiX Toolset を使用します。最近の Windows アプリケーションでは "setup.exe" が MSI 形式のインストーラを呼び出していることが多いようです。MSI 形式の場合、実行には管理者権限が必要です (既定では UAC が働きます)。

まず、MSI 形式インストーラを作成するにはまず WiX Toolset をインストールしてください。インストール直後はパスが設定されていない状態のため、WiX のコマンド群 (例: C:\Program Files (x86)\WiX Toolset v3.10\bin) にパスを通すことも忘れないように。

次に適当なフォルダを用意して (面倒ならばデスクトップでも構いません)、以下の内容でバッチファイルを作成します。

javapackager -deploy -native msi -outdir SceneBuilder -outfile SceneBuilder -srcdir . -srcfiles SceneBuilder-8.0.0.jar  -appclass com.oracle.javafx.scenebuilder.app.SceneBuilderApp -name SceneBuilder -title "JavaFX Scene Builder" -description "JavaFX Scene Builder" -vendor "OpenJFX" -Bicon=SceneBuilder.ico -BappVersion=8.0.0 -BmenuHint=true -BshortcutHint=true -Bwin.menuGroup="JavaFX Scene Builder"

続いてバッチファイルと同じフォルダに実行可能 JAR 形式の Scene Builder (SceneBuilder-8.0.0.jar) とアイコンを置きます。Scene Builder 標準のアイコンは以下のものです。

SceneBuilder.ico

バッチファイル、Scene Builder、アイコンの 3 つが揃ったら、バッチファイルを実行します。成功すれば SceneBuilder というサブフォルダが作成され、SceneBuilder\bundles 以下に MSI インストーラ SceneBuilder-8.0.0.msi が作成されるはずです。

Case 2. EXE 形式インストーラ

EXE 形式はユーザープロファイルの下にアプリケーションをインストールするもので、作成には InnoSetup を使用します。Gluon が配布している EXE 形式インストーラも同様の形式です。この形式はユーザープロファイル以下にインストールするため、管理者権限が不要であるというメリットがあります。

EXE 形式のインストーラを作成するにはまず InnoSetup をインストールしてください。インストール後の設定は特に要らないはずです。その後の手順は WiX の場合とほぼ同じですが、バッチファイルの内容が異なります。

javapackager -deploy -native exe -outdir SceneBuilder -outfile SceneBuilder -srcdir . -srcfiles SceneBuilder-8.0.0.jar  -appclass com.oracle.javafx.scenebuilder.app.SceneBuilderApp -name SceneBuilder -title "JavaFX Scene Builder" -description "JavaFX Scene Builder" -vendor "OpenJFX" -Bicon=SceneBuilder.ico -BappVersion=8.0.0 -BmenuHint=true -BshortcutHint=true -Bwin.menuGroup="JavaFX Scene Builder"

相違点は -native msi の代わりに -native exe を指定しているところです。

Case 3. もう 1 つのオプション -- -native image

ここからはサンプルのバッチファイルは挙げませんが、--native オプションの引数には msi、exe の他に image も指定できます。--native image を指定すると、SceneBuilder\bundles フォルダの下にはインストーラは作成されず、実行形式の EXE ファイルと JRE が展開された形で生成されます。

実はこの JRE には java.exe や javaw.exe は存在せず、必要なライブラリ (JAR およびネイティブ) のみで構成されています。個人的には興味深いものと思っています。

JDK 8 Update 60 から、Windows 版の JavaFX にも HiDPI 対応がしれっと実装されていることは、ご存じの方も少なくないかと思います。この件については青江さん (@aoetk) のエントリ http://aoe-tk.hatenablog.com/entry/2015/08/23/234733 が詳しいので、詳細な考察についてはそちらを参照頂ければと思います。

さて、現在 JavaFX Scene Builder 最新版のバイナリは Oracle から配布されておらず、Gruon などサードパーティーから配布されています。これは非常にありがたいことなのですが、どうやらビルドに使用している JDK8 が旧版のままのようで、JDK8u60 の HiDPI 対応が反映されないという弱点があります。

1 つの方法として、自身の環境を JDK8u60 移行にアップデートした上で配布されている jar ファイルを java -jar ... で起動して解決する方法があるのですが、あまり美しい解決方法とは言えない。そこで、jar 配布版を javapackager でパッケージし直すことを考えました。

ということで、レシピを示します。

用意するもの

  • JDK 8 Update 60 (or later)
  • WiX Toolset (3.0 or later)
  • Scene Builder 8.0.0 の jar ファイル (Gruon 等からダウンロード)
  • SceneBuilder.ico ファイル (どこかからパクる)
  • JDK 8 と WiX への実行パス設定 (意外と忘れる...)

手順

  1. いろいろファイルが出力されるので、1 つ専用のフォルダを作った方が良いでしょう。
  2. Scene Builder の jar ファイルとアイコンファイルを先のフォルダにコピーします。
  3. javapackager を実行します。なお、実行環境に合わせて JDK 8 の 32bit 版/64bit 版をきちんと判別しましょう (特に 64bit 版で作成したものは 32bit 環境では動きません)。
  4. javapackager 実行後、{作成したフォルダ}\SceneBuilder\bundles 以下に SceneBuilder-8.0.0.msi のようなインストーラが作成されていれば、基本的には成功です。

参考

筆者は次のようなスクリプトを作成し、ビルドを行っています。パス等を変更して活用頂ければ幸いです。

javapackager -deploy -native msi -outdir SceneBuilder -outfile SceneBuilder -srcdir . -srcfiles SceneBuilder.jar  -appclass com.oracle.javafx.scenebuilder.app.SceneBuilderApp -name SceneBuilder -title "JavaFX Scene Builder" -description "JavaFX Scene Builder" -vendor "OpenJFX" -Bicon=SceneBuilder.ico -BappVersion=8.0.0 -BmenuHint=true -BshortcutHint=true -Bwin.menuGroup="JavaFX Scene Builder"