Toolsetの概要とインストール方法は、次のWikiページに記載しています。http://www.torutk.com/projects/swe/wiki/WiXJavaFXアプリケーションの実行イメージ作成インストーラーを作成する前に、JavaFXアプリケーションの実行イメージをjlinkコマンドを使って作成しておきます。JavaFXライブラリ(JMODモジュールファイル)と、ビルドしたアプリケーション(モジュール)を--module-pathオプションで指定します。モジュール依存の基点となるJavaFXアプリケーション(モジュール)を--add-modulesオプションで指定します。JavaFXアプリケーション実行用スクリプト/バッチファイルを生成するため、--launcherオプションでモジュールとエントリポイントクラス名を指定します。ここではスクリプト/バッチファイルの名称をanalogclockとし、モジュール名/エントリポイントクラス名を指定します。生成する実行イメージの大きさを小さくするため、--compressオプションでZIP圧縮(=2)を指定します。実行イメージにはJNI用のC/C++ヘッダーファイルを含まないよう--no-header-filesオプションを指定します。実行し、アプリケーションが起動することを確認します。Toolsetを使って、JavaFXアプリケーションのインストーラーを作成します。最低限の機能だけを持つインストーラーを作成します。インストーラー作成では、WiXのXML文書を記述します。今回は、インストールする内容、インストール先ディレクトリを定義するAnalogClock.wxsファイルと、インストールするファイル群をheatコマンドで生成したruntime.wxsファイルを用意します。[ProductName]がインストールされています。</Product></Wix>Wix要素WiXのXML文書構造は、最上位の要素がWixで、Wix要素の属性で名前空間を指定しています。:</Wix>Product要素Wixの子要素にProduct要素を記述し、アプリケーション名などを定義します。</Product>Id属性にはGUIDを指定しますが、"*"を指定するとコンパイル時にGUIDが自動生成されます。インストーラーはこのGUIDが等しいと同じプログラムと認識します。新しいバージョンなどインストーラーを作り直した際はこのGUIDを変更する必要があります。Name属性にはアプリケーション名を定義します。Version属性にはアプリケーションのバージョン番号を定義します。通常ピリオドで区切った4つの数値を指定します。MSIインストーラーはバージョンアップ判定時に4つ目の数字を無視することに留意が必要です。Language属性とCodepage属性には、インストーラーが使用するロケールと文字コードを定義します。日本語の場合は、Language属性に1041、Copdepage属性に932を指定します。Manufacturer属性には開発元の組織名または開発者名を定義します。UpgradeCode属性には同じアプリケーションで新しいバージョンを更新インストールする際の識別に使うGUIDを定義します。このGUIDは後々新しいバージョンのインストーラーを作成するときに継続して使用します。Package要素Productの子要素にPackage要素を記述します。InstallScope="perMachine"/>Description属性とComments属性は、プログラムの説明、コメントを記載します。インストーラーファイルのプロパティ(詳細)で説明に表示されます。InstallerVersion属性はMSIインストーラー(msiexec.exe)のバージョンを指定します。MSIのバージョンに2.0を指定する場合、"200"とします。現時点では4.5を指定("405")してもいいかと思います。SP2に標準搭載されています。InstallScope属性は、全てのユーザーが使用できるperMachineか、インストールしたユーザーだけが使用できるperUserかを指定します。Platform属性は、インストールするパッケージが64bit用であればx64を指定します。この属性でx64を指定すると、Component要素全てにWin64属性の指定が必要になります。そこで、64bitプログラムをインストールする場合は、この属性ではなく、candleコマンドの-archオプションでx64を指定します。新しいバージョンへ更新する仕組みを入れます。[ProductName]がインストールされています。"/>DowngradeErrorMessage属性には、既にインストールされたバージョンより古いバージョンをインストールしようとしたときにエラーメッセージとして表示する内容を定義します。MediaTemplate要素MSIファイルの中にCABファイルを含める場合に指定します(ふつう含めるので)。/>Directory要素インストーラーでインストールする先のディレクトリ構造を定義します。今回は、次のディレクトリにインストールするものとします。AnalogClockこのディレクトリ構造に対応するDirectory要素の定義は次となります。</Directory>ルートディレクトリ(ドライブ)は、Id属性にTARGETDIRを指定します。これは事前定義名ProgramFiles64FolderをId属性に指定します。Filesの下に作成するディレクトリを指定します。</Feature>Feature要素ではインストールする内容を定義します。Toolsetのheatコマンドで自動生成させるので、heatコマンドで作成するComponentGroupのIdを、ComponentGroupRefで参照する記述とします。ComponentGroupのIdはheatコマンドのオプションで指定します。runtime.wxs第1引数で収集対象をディレクトリ(dir)と指定します。-srdオプションでルートディレクトリ(ここではdirオプションに続けて指定したruntimeディレクトリ)に対応するディレクトリの生成を抑制します。Bridge\AnalogClock)の下にruntimeディレクトリが作成され、その下にbinディレクトリ等が配置されます。-drオプションで、インストール先ディレクトリのIdを指定します。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で必要)を抑制するよう指定します。DLLのときにHEAT5150警告が出るのを抑制します。-varオプションで、File要素のSource属性で指定するパスの基点となるフォルダを、変数として生成するよう指定します。このオプションを指定しないと、SourceDirという固定文字列がパスの基点となり、存在しないので後のlightコマンド実行時にエラーとなります。-oオプションでディレクトリ以下のファイル群を収集した情報を吐き出すWiXファイル名を指定します。candleコマンドWiX文書ファイルをcandleコマンドでコンパイルし、wixobjファイル(中間ファイル)を生成します。runtime.wxs64bitバイナリをインストールする場合は、-archオプションでx64を指定します。-dオプションで、heatコマンドで、File要素のSource属性でファイルパスの基点を変数として生成した箇所に実際のパスを設定します。runtime.wixobjファイルが生成されます。lightコマンドWix中間ファイルであるwixobjファイルから、lightコマンドでインストーラーファイルに生成します。analogclock.msi引数に、candleコマンドで生成したwixobjファイル(中間ファイル)をすべて指定します。-oオプションで作成するMSI形式インストーラーのファイル名を指定します。実行結果、analogclock.msiファイルが生成されます。ちなみに、ファイルサイズは38MBでした。インストールこの第一歩のインストーラーは、必要最小限の機能しか設定していないので、インストーラーを実行すると対話(ダイアログ)画面もなく、所定のディレクトリにインストールするだけとなります。スタートメニューやデスクトップへのショートカット登録もありません。analogclock.msiを実行すると、次のように経過を表示する画面が出てすぐに終了します。Bridge\AnalogClock\bin\analogclock.batを実行します。インストーラーの作成(第二歩)第一歩で作成したインストーラーは、所定のディレクトリへプログラムをインストールするだけのものでした。次は、スタートメニューのプログラム一覧にインストールしたJavaFXアプリケーションを起動するショートカットを追加する機能を盛り込みます。</Directory>Directoryのルート要素の子要素に、Id属性でProgramMenuFolderを指定するDirectory要素を追加します。ProgramMenuFolderは事前定義名で、全ユーザー用のスタートメニューのプログラムディレクトリを示します。Menu\Programs)そして、その下にアプリケーションのショートカットを収容するサブフォルダのDirectory要素を追加します。任意のId属性と作成するフォルダ名をName属性に指定します。ショートカット要素を定義プログラムを実行するショートカットを定義します。DirectoryRef要素でショートカットを作成するフォルダを指定し、その子要素にComponent要素で囲ってShortcut要素を定義します。アンインストール用のRemoveFolder要素、Shortcut要素のKeyPath代替としてRegistryValue要素を定義します。/>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要素の子要素に、先ほどショートカット定義で作成したComonent要素のIdを参照するComponentRef要素を追加します。インストールするとスタートメニューにショートカットが生成スタートメニューにショートカットインストーラーの作成(第三歩)第一歩、第二歩で作成したインストーラーは、インストールを実行すると一瞬ダイアログが表示されますがすぐに消えてインストールが完了してしまいます。そこで、普通のインストーラーのように、インストール画面を表示し、ユーザーが操作するとインストールが進むようにします。WiXでは、お仕着せの対話ダイアログがいくつか用意されているので、その中からニーズに合うものを選択することもできますし、カスタムの対話ダイアログを作ることもできます。今回第三歩では、お仕着せの対話ダイアログから最小限の対話を行うWixUI_Minimalを使用します。このWixUI_Minimalは、インストール時にライセンス表示を行い、ユーザーが確認をするとインストールが開始されます。</Product>Product要素の子要素にUIRef要素を追加し、Id属性に事前定義済みWixUI_Minimalを指定します。Format)形式で用意したライセンス許諾ファイルを指定します。アプリケーションのライセンスを記述したファイルをRTF形式で保存します。RTF形式は、Windows標準ツールのWordpadで作成可能です。WixUIExtensionインストール実施MSI形式のインストーラーファイル(第三歩版)を実行すると、ライセンス画面が表示されます。第3歩のインストーラー画面(1)ライセンスを承諾すると、インストールが開始します。第3歩のインストーラー画面(2)インストールが完了すると、インストール完了画面が表示されます。第3歩のインストーラー画面(3)インストーラーの作成(第四歩)こ個までの段階では、インストール先が固定となっています。今回は、インストール先を変更するダイアログを追加します。WiX定義を変更(問題あり)第三歩で追加した対話ダイアログ種類は、ライセンス表示とインストール結果表示を持つWixUI_Minimalでした。これを、インストール先変更表示を持つWixUI_InstallDirに変更します。このWixUI_InstallDirを使うときは、アプリケーションをインストールするディレクトリを定義したDirectory要素のIdを、プロパティWIXUI_INSTALLDIRに指定する必要があります。/>インストール実施(問題あり)インストールを実施すると次の画面が表示されます。第4歩のインストーラー画面(1)ライセンス表示画面が表示されます。第4歩のインストーラー画面(2)デフォルトのインストール先が表示されます。第4歩のインストーラー画面(3)[Change]ボタンを押すと、ディレクトリ選択画面が表示されます。第4歩のインストーラー画面(4)インストール準備完了の画面が表示されます。第4歩のインストーラー画面(5)インストールの経過を示す画面が表示されます。第4歩のインストーラー画面(6)インストールが完了した画面が表示されます。第4歩のインストーラー画面(7)問題とは?インストーラーでインストール先を変更したにも関わらず、インストール先はデフォルトのディレクトリとなってしまいました。調べてみたところ、WIXUI_INSTALLDIRプロパティで指定するディレクトリのIdの名前はすべて大文字とする必要があるということが判明しました。runtime.wxsインストール実施(問題解決)インストーラーの画面に変更はありませんが、インストール先が無事変更できるようになりました。--launcherオプションを指定すると、次のバッチファイルが生成されます。%*このバッチファイルに2つの修正を加えます。起動コマンドをjava.exeからjavaw.exeに変更javaコマンドはコンソール(コマンドプロンプト)を伴うので、このランチャー(バッチファイル)を実行すると画面にコマンドプロンプトが表示されたままとなります。ショートカットでコマンドプロンプトを最小化する設定をしていますが、タスクバーにはコマンドプロンプトが残ったままとなります。そこで、バッチファイルの中でjavaコマンドをjavawコマンドに修正し、コマンドプロンプトが残らないようにします。%*startコマンドでjavawコマンドを起動します。ウィンドウタイトルとして扱い、エラーとなります。CPU・メモリにやさしいコマンドラインオプションを追加64bit版のjava(javaw)コマンドはデフォルトではCPU、メモリをがんがん使う設定となっています。そこで、必要最低限のCPUとメモリ使用にすべく、JavaVMオプションを追加指定します。TorutkまとめJavaFXアプリケーションをJDK11&モジュール(JPMS)対応した後に、Windowsインストーラーを作ってJava実行環境を含めて配布できるようにしました。XMLドキュメント(AnalogClock.wxs、runtime.wxs)をコンパイルlightコマンドで、MSI形式インストーラーを生成ランチャー(バッチファイル)にオプション追記MSIインストーラーのサイズは約38MB、インストール後のサイズは約52MBとなりました。月別アーカイブはてなブログをはじめよう!torutkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。