id:torutk:20120901で、JavaFXのコマンドjavafxpackagerを使って実行可能JAR形式ファイルを作成する方法を紹介しました。今日は、そのjavafxpackagerで、OS固有のインストーラ形式としてWindows OS用のMSI形式インストーラを作成する方法を追究してみます。
情報収集
Oracle blogの翻訳で、JavaFXのネイティブパッケージングについての概要紹介記事となっています。記事中では、ネイティブパッケージの種類にexe、msi、dmg、rpm、zipができます。
Windows MSI形式については、
・WiX(Windows Installer XML) 3.0以後が必要。
・生成されたMSIはユーザレベルインストーラとして機能する(インストールに管理者権限は不要)
・少なくとも一つのショートカットがメニューもしくはデスクトップに作成される
と何ができるかについては詳しいですが、作成方法については概要程度しかありません。
Oracle公式JavaFX 2ドキュメントの配備に関するページです。
ここに、javafxpackagerのコマンド使用例が解説されています。
Example 6-3 JavaFX Packager Command to Generate Self-Contained Application Packages
javafxpackager -deploy -native -outdir packages -outfile BrickBreaker -srcdir dist -srcfiles BrickBreaker.jar -appclass brickbreaker.Main -name "BrickBreaker" -title "BrickBreaker demo"
WiX の入手とインストール
WiX(Windows Installer XML)の入手とインストールについては、以前書いたページが以下URLにありますのでご参照ください。
なお、記事にあるWixEditは不要です。環境変数PATHの設定はお忘れなく。
ビルド(実行可能JAR)は先にすませておく
先に実行可能JAR形式の生成までjavafxpackagerで実行しておきます。id:torutk:20120901で作成したサンプルがあるとします。
MSI形式の生成
まず、WiXのコマンドが実行できるよう環境変数PATHが設定されているか確認します。コマンドプロンプトからcandle.exeが実行できればOKです。
次に、javafxpackagerで、先に生成されたjarファイルをソースとしてインストーラを作成します。
C:\work> javafxpackager -deploy -native -outdir dist -outfile HelloFx -srcdir dist -srcfiles HelloFx-0.1.jar -appclass torutk.HelloFx -name HelloFx -title "Hello JavaFX Demo" Using base JDK at: C:\Program Files\Java\jdk1.7.0\jre Detected [iscc.exe] version 0.0 but version 5.0 is required. Skip [Exe Bundler (based on Inno Setup)] due to [Can not find Inno Setup Compiler (iscc.exe).] Creating app bundle: HelloFx in C:\work\dist\bundles Result application bundle: C:\work\dist\bundles C:\work>
すると、ディレクトリツリーになります。
work +-- dist +-- HelloFx-0.1.jar +-- HelloFx.html +-- HelloFx.jnlp +-- bundles +-- HelloFx-1.0.msi +-- HelloFx +-- HelloFx.exe +-- HelloFx.ico +-- app | +-- HelloFx-0.1.jar | +-- package.cfg +-- runtime +-- jre : 略
distの下にbundlesフォルダが生成され、その中にMSI形式インストーラが存在します。また、その中にHelloFxフォルダがあり、実行ファイル、アイコン、JAR、およびJava実行環境が含まれます。
ちなみに、MSIファイルのサイズは40MB以上となります。
このMSIをインストールしてみると、次のフォルダ構成となります。
C:\Program Files (x86) +-- HelloFx +-- HelloFx.exe +-- HelloFx.ico +-- app | +-- HelloFx-0.1.jar | +-- package.cfg +-- runtime +-- jre : (略)
また、Windowsのスタートメニューには、Unknownフォルダの中にHelloFxが生成されました。
64bit環境での不整合
64bit版のJDK上でjavafxpackagerを使用してMSIインストーラ形式を作成しても、現時点では32bitアプリケーション用のC:\Program Files (x86)下にインストールされる設定となってしまいます。32bit版JDK上で作れば問題ないのですが・・・。
スタートメニューのUnknownについて
javafxpackagerのオプション-vendorが未指定だとUnknownになりました。-vendorを指定します。なお、-vendorオプションはインストール先ディレクトリには影響しませんでした。
Inno SetupとEXE形式について
Inno Setupがインストールされ、環境変数PATHが設定されていると、EXE形式も生成されるとドキュメントにありますが、javafxpackagerを実行した時にはなぜか認識されません。
NetBeans 7.3 Beta2でのMSI形式生成
NetBeans 7.3 Beta2では、JavaFXアプリケーション形式でプロジェクトを作成すると、プロジェクトのプロパティ→ビルド→デプロイメントで、[Enable Native Packaging]チェックボックスがあります。ここをチェックしておくと、プロジェクトの右クリックで、”Build Native Package"がメニュー項目に現れます。
これを実行すると、上述のjavafxpackagerの-nativeオプションが指定されたときと同じ動きをします。
ただし、javafxpackagerの際は、Inno Setupが見当たらない場合、SkipされてWiXによるMSI形式の作成が行われたのに、AntのタスクではInno Setupが見つからない時点でエラー終了となってしまいます。
そこで、エラー発生行をクリックして開くjfx-impl.xmlの当該行である次を削除(またはコメントアウト)します。
<fail message="Error:${line.separator}${missing.Inno.message}" if="missing.Inno"/>
これで、MSI形式のビルドをNetBeans上で実施することができるようになります。