はじめに
JDK 10までは、JavaFX アプリケーションを配布する際に、ネイティブ・インストーラ ー形式にするjavapackager機能を使ってOS固有のインストーラ ーを作成することができました。Windows ネイティブなインストーラ ーを作成する際には、外部ツールとしてWiX Toolsetを使ってMSI 形式のインストーラ ーを作成するか、同じく外部ツールとしてInnoSetupを使ってEXE形式のインストーラ ーを作成することができました。
しかし、JDK 11ではJavaFX とともにjavapackager機能が分離したため、JDK11上でのJavaFX アプリケーションは独自にインストーラ ーを作成することになります。
今回は、次のJavaFX アプリケーションをWindows OS上へインストールするMSI 形式のインストーラ ーを作成していきます。gitのブランチは、jdk11 となります。masterは、JDK 8版のままです。
GitHub - torutk/AnalogClockGadget: JavaFX analog clock program to alternate for a desktop analog clock gadget
環境
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 の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 ^
-srd -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
引数に、candleコマンドで生成したwixobjファイル(中間ファイル)をすべて指定します。
-oオプションで作成するMSI 形式インストーラ ーのファイル名を指定します。
実行結果、analogclock.msi ファイルが生成されます。ちなみに、ファイルサイズは38MBでした。
インストール
この第一歩のインストーラ ーは、必要最小限の機能しか設定していないので、インストーラ ーを実行すると対話(ダイアログ)画面もなく、所定のディレクト リにインストールするだけとなります。スタートメニューやデスクトップへのショートカット登録もありません。
analogclock.msi を実行すると、次のように経過を表示する画面が出てすぐに終了します。
インストーラ ー(最初の一歩)実行画面(1)
インストーラ ー(最初の一歩)実行画面(2)
プログラムを実行するには、インストール先のC:\Program Files\High Bridge\AnalogClock\bin\analogclock.batを実行します。
第一歩で作成したインストーラ ーは、所定のディレクト リへプログラムをインストールするだけのものでした。
次は、スタートメニューのプログラム一覧にインストールしたJavaFX アプリケーションを起動するショートカットを追加する機能を盛り込みます。
Directory要素にスタートメニュー(プログラムメニュー)とサブフォルダ定義を追加
<Directory Id="ApplicationFolder" Name="AnalogClock" />
</Directory>
</Directory>
+ <Directory Id="ProgramMenuFolder">
+ <Directory Id="ApplicationProgramsFolder" Name="High Bridge" />
+ </Directory>
</Directory>
Directoryのルート要素の子要素に、Id属性でProgramMenuFolderを指定するDirectory要素を追加します。ProgramMenuFolderは事前定義名で、全ユーザー用のスタートメニューのプログラムディレクト リを示します。(C:\ProgramData\Microsoft \Windows \Start Menu\Programs)
そして、その下にアプリケーションのショートカットを収容するサブフォルダのDirectory要素を追加します。任意のId属性と作成するフォルダ名をName属性に指定します。
ショートカット要素を定義
プログラムを実行するショートカットを定義します。
DirectoryRef要素でショートカットを作成するフォルダを指定し、その子要素にComponent要素で囲ってShortcut要素を定義します。また、アンインストール用のRemoveFolder要素、Shortcut要素のKeyPath代替としてRegistryValue要素を定義します。
<DirectoryRef Id ="ApplicationProgramsFolder" >
<Component Id ="ApplicationShortcut" Guid ="*" >
<Shortcut Id ="ApplicationStartMenuShortcut"
Icon ="java.exe"
Name ="Analog Clock Gadget"
Show ="minimized"
Target ="[ApplicationFolder]\bin\analogclock.bat"
WorkingDirectory ="ApplicationFolder" />
<RemoveFolder Id ="CleanUpShortcut"
Directory ="ApplicationProgramsFolder"
On ="uninstall" />
<RegistryValue Root ="HKCU"
Key ="Software\[Manufacturer]\[ProductName]"
Name ="installed" Type ="integer" Value ="1"
KeyPath ="yes" />
</Component>
</DirectoryRef>
<Icon Id ="java.exe" SourceFile ="runtime\bin\java.exe" />
DirectoryRef要素のId属性は、先に定義したショートカットを収容するフォルダのId属性を参照
Comonent要素のId属性は、後でFeature要素の子要素に追加するComponentRefで参照する名前を指定
Shortcut要素
Icon属性でショートカットのアイコンを指定(アイコンをリソースに持つexeファイル等も指定可能)、icon要素のId属性を参照します。
Name属性はスタートメニューに表示されるショートカット名となるのでわかりやすい名前を指定
Show属性は、バッチファイルのショートカットを作成した場合に実行時にコマンドプロンプト が表示されるのを抑制するためminimizedを指定
Target属性はショートカットの対象ファイルを指定。Directory要素のIdで定義した名前を利用することができる
WorkingDirectory属性でショートカット実行時のカレントディレクト リを指定
RemoveFolder要素は、アンインストール時にショートカットフォルダを削除するための定義をしています。
RegistryValue要素は、Shortcut要素がKeyPath属性を持てない制約を解決するために、レジストリ を使用します。
Icon要素は、Shortcut要素のIcon属性から参照され、ショートカットのアイコンを規定します。Idは対象ファイルと同じ拡張子を持つ必要があります。
Feature要素に追加
<Feature Id="Product" Title="Analog Clock" Level="1">
<ComponentGroupRef Id="RuntimeGroup" />
+ <ComponentRef Id="ApplicationShortcut" />
</Feature>
Feature要素の子要素に、先ほどショートカット定義で作成したComonent要素のIdを参照するComponentRef要素を追加します。
インストールするとスタートメニューにショートカットが生成
スタートメニューにショートカット
第一歩、第二歩で作成したインストーラ ーは、インストールを実行すると一瞬ダイアログが表示されますがすぐに消えてインストールが完了してしまいます。
そこで、普通のインストーラ ーのように、インストール画面を表示し、ユーザーが操作するとインストールが進むようにします。
WiX では、お仕着せの対話ダイアログがいくつか用意されているので、その中からニーズに合うものを選択することもできますし、カスタムの対話ダイアログを作ることもできます。今回第三歩では、お仕着せの対話ダイアログから最小限の対話を行うWixUI_Minimalを使用します。このWixUI_Minimalは、インストール時にライセンス表示を行い、ユーザーが確認をするとインストールが開始されます。
WiX 定義にUIを追加
</Feature>
+
+ <UIRef Id="WixUI_Minimal" />
+ <WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
+
</Product>
Product要素の子要素にUIRef要素を追加し、Id属性に事前定義済みWixUI_Minimalを指定します。
同じく、Product要素の子要素にWixVariable要素を追加し、Id属性に事前定義済みWixUILicenseRtfを指定、Value 属性にRTF(Rich Text Format)形式で用意したライセンス許諾ファイルを指定します。アプリケーションのライセンスを記述したファイルをRTF形式で保存します。RTF形式は、Windows 標準ツールのWordpadで作成可能です。
lightコマンドのオプション追加
- light AnalogClock.wixobj runtime.wixobj -o analogclock.msi
+ light AnalogClock.wixobj runtime.wixobj -o analogclock.msi -ext WixUIExtension
インストール実施
MSI 形式のインストーラ ーファイル(第三歩版)を実行すると、ライセンス画面が表示されます。
第3歩のインストーラ ー画面(1)
ライセンスを承諾すると、インストールが開始します。
第3歩のインストーラ ー画面(2)
インストールが完了すると、インストール完了画面が表示されます。
第3歩のインストーラ ー画面(3)
こ個までの段階では、インストール先が固定となっています。今回は、インストール先を変更するダイアログを追加します。
WiX 定義を変更(問題あり)
第三歩で追加した対話ダイアログ種類は、ライセンス表示とインストール結果表示を持つWixUI_Minimalでした。これを、インストール先変更表示を持つWixUI_InstallDirに変更します。
このWixUI_InstallDirを使うときは、アプリケーションをインストールするディレクト リを定義したDirectory要素のIdを、プロパティWIXUI_INSTALLDIRに指定する必要があります。
</Feature>
- <UIRef Id="WixUI_Minimal" />
+ <Property Id="WIXUI_INSTALLDIR" Value="ApplicationFolder" />
+ <UIRef Id="WixUI_InstallDir" />
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
インストール実施(問題あり)
インストールを実施すると次の画面が表示されます。
第4歩のインストーラ ー画面(1)
ライセンス表示画面が表示されます。
第4歩のインストーラ ー画面(2)
デフォルトのインストール先が表示されます。
第4歩のインストーラ ー画面(3)
[Change]ボタンを押すと、ディレクト リ選択画面が表示されます。
第4歩のインストーラ ー画面(4)
インストール準備完了の画面が表示されます。
第4歩のインストーラ ー画面(5)
インストールの経過を示す画面が表示されます。
第4歩のインストーラ ー画面(6)
インストールが完了した画面が表示されます。
第4歩のインストーラ ー画面(7)
問題とは?
インストーラ ーでインストール先を変更したにも関わらず、インストール先はデフォルトのディレクト リとなってしまいました。
いろいろ調べてみたところ、WIXUI_INSTALLDIRプロパティで指定するディレクト リのIdの名前はすべて大文字とする必要があるということが判明しました。
WiX 定義を変更(問題解決)
AnalogClock.wxsの変更箇所
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="CompanyFolder" Name="High Bridge">
- <Directory Id="ApplicationFolder" Name="AnalogClock" />
+ <Directory Id="APPLICATIONFOLDER" Name="AnalogClock" />
</Directory>
</Directory>
Show="minimized"
- Target="[ApplicationFolder]\bin\analogclock.bat"
- WorkingDirectory="ApplicationFolder"/>
+ Target="[APPLICATIONFOLDER]\bin\analogclock.bat"
+ WorkingDirectory="APPLICATIONFOLDER"/>
<RemoveFolder Id="CleanUpShortcut"
<UIRef Id="WixUI_InstallDir" />
+ <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER" />
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
heatコマンド実行オプションの変更
D:\work\AnalogClockGadget> heat dir runtime ^
- -srd -dr ApplicationFolder ^
+ -srd -dr APPLICATIONFOLDER ^
-cg RuntimeGroup ^
-gg -g1 ^
-sfrag -sreg ^
-var "var.runtimeFolder" -o runtime.wxs
インストール実施(問題解決)
インストーラ ーの画面に変更はありませんが、インストール先が無事変更できるようになりました。
jlinkで生成するランチャー(バッチファイル)の修正
jlink で--launcherオプションを指定すると、次のバッチファイルが生成されます。
@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
"%DIR%\java" %JLINK_VM_OPTIONS% -m com.torutk.gadget.analogclock/com.torutk.gadget.calendar.AnalogClockApp %*
このバッチファイルに2つの修正を加えます。
実行時にコマンドプロンプト が表示されたままとならないよう起動コマンドをjava .exeからjavaw.exeに変更
CPU・メモリにやさしいプロセスとするべくコマンドライン オプションを追加
起動コマンドをjava .exeからjavaw.exeに変更
java コマンドはコンソール(コマンドプロンプト )を伴うので、このランチャー(バッチファイル)を実行すると画面にコマンドプロンプト が表示されたままとなります。ショートカットでコマンドプロンプト を最小化する設定をしていますが、タスクバーにはコマンドプロンプト が残ったままとなります。
そこで、バッチファイルの中でjava コマンドをjavawコマンドに修正し、コマンドプロンプト が残らないようにします。
@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
- "%DIR%\java" %JLINK_VM_OPTIONS% -m com.torutk.gadget.analogclock/com.torutk.gadget.calendar.AnalogClockApp %*
+ start "" /b "%DIR%\javaw" %JLINK_VM_OPTIONS% -m com.torutk.gadget.analogclock/com.torutk.gadget.calendar.AnalogClockApp %*
startコマンドでjavawコマンドを起動します。最初の""がないと、startコマンドが"%DIR%javaw" をウィンドウタイトルとして扱い、エラーとなります。
CPU・メモリにやさしいコマンドライン オプションを追加
64bit版のjava (javaw)コマンドはデフォルトではCPU、メモリをがんがん使う設定となっています。
そこで、必要最低限のCPUとメモリ使用にすべく、JavaVMオプションを追加指定します。
@echo off
- set JLINK_VM_OPTIONS=
+ set JLINK_VM_OPTIONS=-Xms32m -Xmx64m -Xss256k ^
+ -XX:TieredStopAtLevel=1 -XX:CICompilerCount=2 -XX:CompileThreshold=1500 ^
+ -XX:InitialCodeCacheSize=160k -XX:ReservedCodeCacheSize=32m ^
+ -XX:MetaspaceSize=12m -XX:+UseSerialGC
set DIR=%~dp0
start "" /b "%DIR%\javaw" %JLINK_VM_OPTIONS% ^
-m com.torutk.gadget.analogclock/com.torutk.gadget.analogclock.AnalogClockApp
オプションの意味・値などは次に簡単なまとめ記載
JDK 9 JavaVMオプション - ソフトウェアエンジニアリング - Torutk
まとめ
JavaFX アプリケーションをJDK11&モジュール(JPMS)対応した後に、Windows インストーラ ーを作ってJava 実行環境を含めて配布できるようにしました。
作業環境は、Windows 10、OpenJDK 11.0.1、OpenJFX 11.0.1、WiX Toolset 3.10
jlink コマンドで、JavaFX アプリケーションとその実行に必要なモジュールを抽出して実行環境のイメージを作成
WiX Toolset で実行環境のイメージからMSI 形式インストーラ ーを作成
AnalogClock.wxs ファイル(XML ドキュメント)を記述し、アプリケーションの情報、インストール先ディレクト リ、スタートメニューのショートカット、インストーラ ーのGUI 種類などを定義
heatコマンドでjlinkが生成した実行環境のディレクト リ・ファイル情報を収集し runtime.wxsファイル(XML ドキュメント)を生成
candleコマンドで、2つのWiX XML ドキュメント(AnalogClock.wxs、runtime.wxs)をコンパイル
lightコマンドで、MSI 形式インストーラ ーを生成
ランチャー(バッチファイル)にオプション追記
MSI インストーラ ーのサイズは約38MB、インストール後のサイズは約52MBとなりました。