はじめに
JDK 10までは、JavaFXアプリケーションを配布する際に、ネイティブ・インストーラー形式にするjavapackager機能を使ってOS固有のインストーラーを作成することができました。Windowsネイティブなインストーラーを作成する際には、外部ツールとしてWiX Toolsetを使ってMSI形式のインストーラーを作成するか、同じく外部ツールとしてInnoSetupを使ってEXE形式のインストーラーを作成することができました。
しかし、JDK 11ではJavaFXとともにjavapackager機能が分離したため、JDK11上でのJavaFXアプリケーションは独自にインストーラーを作成することになります。
今回は、次のJavaFXアプリケーションをWindows OS上へインストールするMSI形式のインストーラーを作成していきます。
環境
項目 | 内容 |
---|---|
OS | Windows 10 64bit |
JDK | OpenJDK 11.0.1 |
インストーラー作成ツール | WiX Toolset 3.10 |
WiX Toolsetの概要とインストール方法は、次のWikiページに記載しています。
http://www.torutk.com/projects/swe/wiki/WiX
JavaFXアプリケーションの実行イメージ作成
インストーラーを作成する前に、JavaFXアプリケーションの実行イメージをjlinkコマンドを使って作成しておきます。
D:\work\AnalogClockGadget> jlink ^ --module-path"C:\Program Files\Java\JavaFX\javafx-jmods-11.0.1";build\modules ^ --add-modules com.torutk.gadget.analogclock ^ --launcher analogclock=com.torutk.gadget.analogclock/com.torutk.gadget.analogclock.AnalogClockApp ^ --compress=2 --no-header-files --output runtime D:\work\AnalogClockGadget> dir/w runtime [.] [..] [bin] [conf] [legal] [lib] release D:\work\AnalogClockGadget>
- JavaFXライブラリ(JMODモジュールファイル)と、ビルドしたアプリケーション(モジュール)を--module-pathオプションで指定します。
- モジュール依存の基点となるJavaFXアプリケーション(モジュール)を--add-modulesオプションで指定します。
- JavaFXアプリケーション実行用スクリプト/バッチファイルを生成するため、--launcherオプションでモジュールとエントリポイントクラス名を指定します。ここではスクリプト/バッチファイルの名称をanalogclockとし、モジュール名/エントリポイントクラス名を指定します。
- 生成する実行イメージの大きさを小さくするため、--compressオプションでZIP圧縮(=2)を指定します。
- 実行イメージにはJNI用のC/C++ヘッダーファイルを含まないよう--no-header-filesオプションを指定します。
生成されたruntimeディレクトリのbin\analogclock.bat を実行し、アプリケーションが起動することを確認します。
インストーラーの作成(第一歩)
WiX Toolsetを使って、JavaFXアプリケーションのインストーラーを作成します。まずは、最低限の機能だけを持つインストーラーを作成します。
インストーラー作成では、WiXのXML文書を記述します。今回は、インストールする内容、インストール先ディレクトリを定義するAnalogClock.wxsファイルと、インストールするファイル群をheatコマンドで生成したruntime.wxsファイルを用意します。
WiX用XMLドキュメント(AnalogClock.wxs)
AnalogClock.wsx(左端の▼印をクリックすると内容を表示/非表示)
<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"><Product Id="*"Name="Analog Clock"Language="1041"Codepage="932"Version="0.4.1"Manufacturer="High Bridge"UpgradeCode="fe287b25-e03d-4744-90f4-96b05dc36bf0"><Package Description="Analog Clock Gadget"Comments="(c) 2019 High Bridge"InstallerVersion="200"Compressed="yes"InstallScope="perMachine" /><MajorUpgrade DowngradeErrorMessage="既に新しい [ProductName]がインストールされています。"/><MediaTemplate EmbedCab="yes" /><Directory Id="TARGETDIR"Name="SourceDir"><Directory Id="ProgramFiles64Folder"><Directory Id="CompanyFolder"Name="High Bridge"><Directory Id="ApplicationFolder"Name="AnalogClock" /></Directory></Directory></Directory><Feature Id="Product"Title="Analog Clock"Level="1"><ComponentGroupRef Id="RuntimeGroup" /></Feature></Product></Wix>
Wix要素
WiXのXML文書構造は、最上位の要素がWixで、Wix要素の属性で名前空間を指定しています。
<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> : </Wix>
Product要素
Wixの子要素にProduct要素を記述し、アプリケーション名などを定義します。
<Product Id="*"Name="Analog Clock"Language="1041"Codepage="932"Version="0.4.1"Manufacturer="High Bridge"UpgradeCode="fe287b25-e03d-4744-90f4-96b05dc36bf0"> : </Product>
- Id属性にはGUIDを指定しますが、"*"を指定するとコンパイル時にGUIDが自動生成されます。インストーラーはこのGUIDが等しいと同じプログラムと認識します。新しいバージョンなどインストーラーを作り直した際はこのGUIDを変更する必要があります。
- Name属性にはアプリケーション名を定義します。
- Version属性にはアプリケーションのバージョン番号を定義します。通常ピリオドで区切った4つの数値を指定します。ただしMSIインストーラーはバージョンアップ判定時に4つ目の数字を無視することに留意が必要です。
- Language属性とCodepage属性には、インストーラーが使用するロケールと文字コードを定義します。日本語の場合は、Language属性に1041、Copdepage属性に932を指定します。
- Manufacturer属性には開発元の組織名または開発者名を定義します。
- UpgradeCode属性には同じアプリケーションで新しいバージョンを更新インストールする際の識別に使うGUIDを定義します。このGUIDは後々新しいバージョンのインストーラーを作成するときに継続して使用します。GUIDを生成する方法については、Windowsデスクトップ環境でUUID(GUID)を生成する方法 - torutkのブログや、 GUIDの生成に記載しています。
Package要素
Productの子要素にPackage要素を記述します。
<Package Description="Analog Clock Gadget"Comments="(c) 2019 High Bridge"InstallerVersion="200"Compressed="yes"InstallScope="perMachine"/>
- Description属性とComments属性は、プログラムの説明、コメントを記載します。インストーラーファイルのプロパティ(詳細)で説明に表示されます。
- InstallerVersion属性はMSIインストーラー(msiexec.exe)のバージョンを指定します。MSIのバージョンに2.0を指定する場合、"200"とします。現時点では4.5を指定("405")してもいいかと思います。MSI 4.5は、Windows Vista SP2、Windows Server 2008 SP2に標準搭載されています。
- InstallScope属性は、全てのユーザーが使用できるperMachineか、インストールしたユーザーだけが使用できるperUserかを指定します。
Platform属性は、インストールするパッケージが64bit用であればx64を指定します。この属性でx64を指定すると、Component要素全てにWin64属性の指定が必要になります。そこで、64bitプログラムをインストールする場合は、この属性ではなく、candleコマンドの-archオプションでx64を指定します。
MajorUpgrade要素
新しいバージョンへ更新する仕組みを入れます。
<MajorUpgrade DowngradeErrorMessage="既に新しい [ProductName]がインストールされています。"/>
DowngradeErrorMessage属性には、既にインストールされたバージョンより古いバージョンをインストールしようとしたときにエラーメッセージとして表示する内容を定義します。
MediaTemplate要素
MSIファイルの中にCABファイルを含める場合に指定します(ふつう含めるので)。
<MediaTemplate EmbedCab="yes" />
Directory要素
インストーラーでインストールする先のディレクトリ構造を定義します。 今回は、次のディレクトリにインストールするものとします。
C:\ +-- Program Filse +-- High Bridge +-- AnalogClock
このディレクトリ構造に対応するDirectory要素の定義は次となります。
<Directory Id="TARGETDIR"Name="SourceDir"><Directory Id="ProgramFiles64Folder"><Directory Id="CompanyFolder"Name="High Bridge"><Directory Id="ApplicationFolder"Name="AnalogClock" /></Directory></Directory></Directory>
- ルートディレクトリ(ドライブ)は、Id属性にTARGETDIRを指定します。
- 64bitアプリがインストールされるシステム共通のディレクトリは C:\Program Files ですが、これは事前定義名ProgramFiles64FolderをId属性に指定します。
- C:\Program Filesの下に作成するディレクトリを指定します。
Feature要素
<Feature Id="Product"Title="Analog Clock"Level="1"><ComponentGroupRef Id="RuntimeGroup" /></Feature>
Feature要素ではインストールする内容を定義します。今回は、インストールするファイル群をWiX Toolsetのheatコマンドで自動生成させるので、heatコマンドで作成するComponentGroupのIdを、ComponentGroupRefで参照する記述とします。なお、ComponentGroupのIdはheatコマンドのオプションで指定します。
WiX Toolsetコマンドの実行
heatコマンドでruntimeディレクトリ以下のファイル群から定義作成
D:\work\AnalogClockGadget> heat dir runtime ^ -sdr -dr ApplicationFolder ^ -cg RuntimeGroup ^ -gg -g1 ^ -sfrag -sreg ^ -var "var.runtimeFolder" -o runtime.wxs
- 第1引数で収集対象をディレクトリ(dir)と指定します。
- -srdオプションでルートディレクトリ(ここではdirオプションに続けて指定したruntimeディレクトリ)に対応するディレクトリの生成を抑制します。このオプションを指定しないと、インストール先ディレクトリ(C:\Program Files\High Bridge\AnalogClock)の下にruntimeディレクトリが作成され、その下にbinディレクトリ等が配置されます。 -drオプションで、インストール先ディレクトリのIdを指定します。今回はAnalogClock.wxs でAnalogClockプログラムをインストールするディレクトリとして定義したDirectory要素のIdに指定したApplicationFolderを指定しています。
- -cgオプションで、生成するComonentGroupのIdを指定します。このIdは、AnalogClock.wxsのFeature要素の子要素ComponentGroupRefで参照されるので一致させる必要があります。
- -ggオプションで各ComponentのGUIDを生成するよう指定します。
- -ggオプションでGUIDを生成する際、波括弧を省略するよう指定します。
- -sfragオプションでFragment要素をComponent要素毎ではなく、ComponentGroup要素に1つ生成するよう指定します。
- -sregオプションで、DLLファイルに対するレジストリ情報収集(COMのDLLで必要)を抑制するよう指定します。64bit DLLのときにHEAT5150警告が出るのを抑制します。
- -varオプションで、File要素のSource属性で指定するパスの基点となるフォルダを、変数として生成するよう指定します。このオプションを指定しないと、SourceDirという固定文字列がパスの基点となり、存在しないので後のlightコマンド実行時にエラーとなります。
- -oオプションでディレクトリ以下のファイル群を収集した情報を吐き出すWiXファイル名を指定します。
candleコマンド
WiX文書ファイルをcandleコマンドでコンパイルし、wixobjファイル(中間ファイル)を生成します。
D:\work\AnalogClockGadget> candle -arch x64 package\windows\AnalogClock.wxs D:\work\AnalogClockGadget> candle -arch x64 -druntimeFolder=runtime runtime.wxs
- 64bitバイナリをインストールする場合は、-archオプションでx64を指定します。
- -dオプションで、heatコマンドで、File要素のSource属性でファイルパスの基点を変数として生成した箇所に実際のパスを設定します。
実行結果、AnalogClock.wixobj と runtime.wixobjファイルが生成されます。
lightコマンド
Wix中間ファイルであるwixobjファイルから、lightコマンドでインストーラーファイルに生成します。
D:\work\AnalogClockGadget> light AnalogClock.wixobj runtime.wixobj -o analogclock.msi
実行結果、analogclock.msiファイルが生成されます。ちなみに、ファイルサイズは38MBでした。
インストール
この第一歩のインストーラーは、必要最小限の機能しか設定していないので、インストーラーを実行すると対話(ダイアログ)画面もなく、所定のディレクトリにインストールするだけとなります。スタートメニューやデスクトップへのショートカット登録もありません。
analogclock.msiを実行すると、次のように経過を表示する画面が出てすぐに終了します。


プログラムを実行するには、インストール先のC:\Program Files\High Bridge\AnalogClock\bin\analogclock.batを実行します。