JavaFXアプリケーションの配布と実行

だいぶネタが切れてきた感じですが、JavaFXの実行に関する方法や裏側を少しだけ紹介したいと思います。

まず、現時点でのJavaFXの配布形式はモバイルをのぞけば以下の3パターンです。

  1. 素で実行
  2. Java Web Start(JWS)
  3. Applet

それぞれ確認した上で、現状をまとめます。

素で実行

まず、JavaFX Scriptをそのまま実行する方法ですが、現時点ではJavaFXのRuntimeが必要です。つまり、JavaFX SDKをインストールしてパスを通していない限り、JavaFXを動かす事はできません。したがって、現時点では、実行方法としては選択肢になりません。
これは大きな問題なのですが、現時点ではそうなんだとあきらめて他の方法をみておきます。

Java Web Start

JWSはJavaのアプリケーション配布方法の1つで、ウェブ上にあるjnlpファイルにアプリケーションの構成を記述します。例えばどんな拡張ライブラリを使うかなどが記述されており、ユーザはブラウザからボタンをクリックするだけでアプリケーションを実行できます。実行するアプリケーションはローカルPCのキャッシュに保存されるため、2回目以降はダウンロードは実行されません(バージョンがあがった場合、ダウンロードされる)。ディスクトップにショートカットを作る機能などもあり、アプリケーションの配布方法として使いやすいでしょう。

Applet

もう1つの方法はブラウザの中でFlashのように実行するAppletです。Appletの場合はhtmlの中に記述したコードからApplet用のjnlpを呼び出し、ブラウザ上に表示されています。基本的に実行場所がブラウザ上かどうかという違いしか有りません。

JWSの裏側

JWSはJavaのプログラムの実行・配布の仕組みであり、JavaFXは本来関係ありません。どのように実現しているかと言えば、実はこんな風になっています。
1. アプリケーションのコードがコンパイルされる
2.アプリのメインスクリプトを実行するようなJavaクラス(com.sun.javafx.runtime.main.Main)が自動生成される
3. JWSでは2のJavaクラスを実行するようにjnlpを作成する
4. JWSの必要ライブラリにJavaFXのライブラリを追加する
元々JavaFXディスクトップ版はJavaSEの上にライブラリ(フレームワーク)としてのJavaFXが乗り、その上でJavaFX Scriptが実行される仕組みです。そこで、JWSではラップするようなメインクラスを作成し、そこから呼び出すような仕組みになっています。また、FXのライブラリはJWS実行時にダウンロードされるため、JavaSE(JRE)がインストールされていれば初回は少し時間がかかるものの誰でもJavaFXが実行できるようになっています。

現状の問題

さて、問題はある顧客または同じ会社の部署の人に、簡単なGUIツールを提供する場合です。Swingなり他の言語のアプリケーションであってもプログラムを作成し、実行形式にコンパイルします。相手はそのファイルをダブルクリックなどで実行すればツールを使える訳です。この場合、信頼している(はずの)ベンダーが作成したプログラムですからセキュリティ云々いうのは野暮な話です。ダウンロードしてきたフリーソフトであっても同じでしょう。
実は、現状のJavaFXではこのような形でのアプリケーション配布ができないのです。あくまでJWSの形式をとっているため、インターネットからダウンロードする形でなければ動きません。とはいえ、仕組みとしてはラップするようなJavaクラスがあり、JREの中にJavaFX用のライブラリがあればいいわけで、いずれは提供されると思います。

回避手段

現時点では、ユーザにアプリを配布して通常のアプリのように実行してもらうには次のようにする必要が有ります。
まずjnlpのcodebaseをローカルディレクトリとし、ユーザにはそのディレクトリにアプリケーションを配置してもらいます(インストーラが必要かもしれませんし、WindowsMacでは置き場所をかえる必要も有るでしょう)。また、少なくとも初回の実行時にはインターネットに接続できる環境でなければダメです。
また、通常のSwingアプリ等であれば実行されたディレクトリのパスを取得できますが、JWSである以上、実行ディレクトリのパスという概念がありません。したがって、データの保存フォルダなどはjnlpからパラメータとして渡す必要があるでしょう。
さらに面倒なのはローカルから実行するようなアプリであっても、ローカルファイルにアクセスするようなアプリケーションの場合、署名が必要であるということです。形式としてはJWSなのでサンドボックスでの実行になります。したがって、自己署名でもいいので署名する必要があり、自己署名であれば警告ダイアログが出て印象が悪いです。

まとめ

JavaFXは現状ではJWSとして実行するしか選択肢がないので、ちょっとしたツールを作って配布したいような場合は注意しましょう。