torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFXアプリケーションをインストーラ形式(msi)に

id:torutk:20120901で、JavaFXのコマンドjavafxpackagerを使って実行可能JAR形式ファイルを作成する方法を紹介しました。今日は、そのjavafxpackagerで、OS固有のインストーラ形式としてWindows OS用のMSI形式インストーラを作成する方法を追究してみます。

情報収集

Oracle blogの翻訳で、JavaFXのネイティブパッケージングについての概要紹介記事となっています。記事中では、ネイティブパッケージの種類にexe、msidmgrpm、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上で実施することができるようになります。