プロジェクト

全般

プロフィール

調査 #24

完了

Javaネイティブパッケージの作り方(Windows MSI形式)

高橋 徹 さんが9年以上前に追加. 5年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2014/11/30
期日:
2015/03/07
進捗率:

100%

予定工数:

説明

Javaプログラムは、対象OSのインストーラ形式を作成しインストールすることができる。
そこで、Windows用のMSI形式でネイティブインストーラを作成しインストールするための環境、設定、制約を報告書にまとめる。


ファイル

projectmenu_package-1.png (29.3 KB) projectmenu_package-1.png 高橋 徹, 2015/02/23 08:23
project_property-1.png (38.7 KB) project_property-1.png 高橋 徹, 2015/02/23 08:30

高橋 徹 さんが約9年前に更新

  • ファイル projectmenu_package-1.png projectmenu_package-1.png を追加
  • 題名JavaFXネイティブパッケージの作り方 から JavaFXネイティブパッケージの作り方(Windows MSI形式) に変更
  • 説明 を更新 (差分)
  • 期日2014/12/31 から 2015/03/07 に変更
  • ステータス新規 から 進行中 に変更
  • 進捗率0 から 50 に変更

NetBeans 8.0では、ネイティブインストーラの作成がサポートされている。
プロジェクトのプロパティ > ビルド > デプロイメントで、[ネイティブ・パッケージングの有効化]にチェックを付けると、プロジェクトのコンテキストメニューに[パッケージとして]が選べるようになる。

projectmenu_package-1.png

MSIインストーラを選ぶと、WiX toolsetを呼び出してMSI形式のインストーラを作成する。

インストーラの名前、ベンダー、バージョンなどの情報は、プロジェクトのプロパティ > アプリケーション で設定できる共通のアプリケーション・プロパティにあるタイトル、ベンダー、説明、実装バージョンなどが適用される。

高橋 徹 さんが約9年前に更新

問題点

共通のアプリケーション・プロパティで、タイトルに日本語を入れたところ、ネイティブインストーラのビルドがエラーとなった。

project_property-1.png

NetBeansでのビルドエラーメッセージ 表示

高橋 徹 さんが約9年前に更新

エラーメッセージから、失敗しているのは、WiX toolsetのcandle.exeコマンド呼び出し

簡略化すると次のコマンドラインオプションを与えてcandle.exeが実行されている。

candle.exe
 -nologo
 path\to\アナログ時計SVG版.wxs
 -ext WixUtilExtension
 -out path\to\アナログ時計SVG版.wixobj

共通のアプリケーションプロパティの設定の日本語を順次英語に戻してみた。

試行# 結果 タイトル ベンダー 説明 ホームページ スプラッシュ画面 実装バージョン
1 NG 英語  日本語 日本語 0.1.0
2 NG 英語  英語  日本語 0.1.0
3 OK 英語  英語  英語  0.1.0
4 NG 英語  日本語 英語  0.1.0
5 NG 日本語 英語  英語  0.1.0

高橋 徹 さんが約9年前に更新

JDKのjavapackagerをコマンドラインで呼び出しその振る舞いを把握する。

まず、バッチファイルを作成した。

javapackager -deploy -native msi ^
-v ^
-outdir dist -outfile AnalogClockSvg ^
-srcdir dist -srcfiles AnalogClockSvg.jar ^
-appclass analogclocksvg.AnalogClockSvg ^
-name "AnalogClockSVG" ^
-BappVersion=0.1.1 ^
-Bruntime=C:/java/jdk1.8.0_31/jre ^
-title "Analog Clock with SVG" ^
-vendor Takahashi ^
-description "Analog Clock on desktop" 

実行結果

自身へのjarのコピーをスキップします: AnalogClockSvg.jar
次にあるベースJDKを使用: C:\java\jdk1.8.0_31\jre
Running [C:\java\jdk1.8.0_31\jre\bin\java, -version]
Running [C:\Program Files (x86)\WiX Toolset v3.9\bin\candle.exe, /?]
  Detected [C:\Program Files (x86)\WiX Toolset v3.9\bin\candle.exe] version [3.9]
Running [C:\Program Files (x86)\WiX Toolset v3.9\bin\light.exe, /?]
  Detected [C:\Program Files (x86)\WiX Toolset v3.9\bin\light.exe] version [3.9]WiX 3.6 detected. Enabling advanced cleanup action.
  Using default package resource [application icon]  (add package/windows/AnalogClockSVG.ico to the class path to customize)
Running [R:\Temp\iconswap2461017857659480161.exe, R:\Temp\fxbundler1096613707257883437\windows\AnalogClockSVG.ico, R:\Temp\fxbundler1096613707257883437\images\win-msi.image\AnalogClockSVG\AnalogClockSVG.exe]
Icon File Name: R:\Temp\fxbundler1096613707257883437\windows\AnalogClockSVG.ico
Executable File Name: R:\Temp\fxbundler1096613707257883437\images\win-msi.image\AnalogClockSVG\AnalogClockSVG.exe
  Config files are saved to R:\Temp\fxbundler1096613707257883437\windows. Use them to customize package.
Generated product GUID: 09fc6432-e964-4317-8425-f90f21def720
  Using default package resource [WiX config file]  (add package/windows/AnalogClockSVG.wxs to the class path to customize)
Using default package resource [script to run after application image is populated]  (add package/windows/AnalogClockSVG-post-image.wsf to the class path to customize)
Preparing MSI config: C:\work\AnalogClock\AnalogClockSvg\dist\bundles\AnalogClockSVG-0.1.1.msi
Running [C:\Program Files (x86)\WiX Toolset v3.9\bin\candle.exe, -nologo, R:\Temp\fxbundler1096613707257883437\windows\AnalogClockSVG.wxs, -ext, WixUtilExtension, -out, R:\Temp\fxbundler1096613707257883437\tmp\AnalogClockSVG.wixobj] in R:\Temp\fxbundler1096613707257883437\images\win-msi.image\AnalogClockSVG
AnalogClockSVG.wxs
Generating MSI: C:\work\AnalogClock\AnalogClockSvg\dist\bundles\AnalogClockSVG-0.1.1.msi
Running [C:\Program Files (x86)\WiX Toolset v3.9\bin\light.exe, -nologo, -spdb, -sice:60, R:\Temp\fxbundler1096613707257883437\tmp\AnalogClockSVG.wixobj, -ext, WixUtilExtension, -out, C:\work\AnalogClock\AnalogClockSvg\dist\bundles\AnalogClockSVG-0.1.1.msi] in R:\Temp\fxbundler1096613707257883437\images\win-msi.image\AnalogClockSVG
R:\Temp\fxbundler1096613707257883437\windows\AnalogClockSVG.wxs(43) : warning LGHT1076 : ICE36: Icon Bloat. Icon DesktopIcon.exe is not used in the Class, Shortcut, or ProgID table and also not used for ARPPRODUCTICON property.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(6) : warning LGHT1076 : ICE57: Component 'comp0' has both per-user and per-machine data with an HKCU Registry KeyPath.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(314) : warning LGHT1076 : ICE60: The file FileId142 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(316) : warning LGHT1076 : ICE60: The file FileId143 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(318) : warning LGHT1076 : ICE60: The file FileId144 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(320) : warning LGHT1076 : ICE60: The file FileId145 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(322) : warning LGHT1076 : ICE60: The file FileId146 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(324) : warning LGHT1076 : ICE60: The file FileId147 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(326) : warning LGHT1076 : ICE60: The file FileId148 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
R:\Temp\fxbundler1096613707257883437\windows\bundle.wxi(328) : warning LGHT1076 : ICE60: The file FileId149 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
  Config files are saved to R:\Temp\fxbundler1096613707257883437\windows. Use them to customize package.

高橋 徹 さんがほぼ8年前に更新

javapackagerのオプションと生成されるMSIファイルのプロパティを調査

  • createmsi.ps1
    javapackager -deploy -native msi -v `
    -outdir dist -outfile OutFile `
    -srcdir dist -srcfiles AnalogClockSvg.jar `
    -appclass analogclocksvg.AnalogClockSvg `
    -name NameOption `
    -BappVersion="0.1.2" `
    -title "Title Option" `
    -vendor Vendor `
    -description "Description Option" 
    
  • 生成されたMSIファイル名
    NameOption-0.1.2.msi
  • MSIファイルのプロパティ > 詳細
    • タイトル
      Installation Database
    • 件名
      Description Option
    • コメント
      None
    • 作成者
      Vendor
  • インストールディレクトリ
    C:\Program Files\NameOption
  • 実行ファイル名
    C:\Program Files\NameOption\NameOption.exe
  • スタートメニュー
    すべてのプログラム > Vendor > NameOption
  • コントロールパネル > プログラムのアンインストールまたは変更
    • 名前
      NameOption
    • 発行元
      Vendor
    • バージョン
      0.1.2

高橋 徹 さんがほぼ8年前に更新

javapackagerのオプションと生成されるMSIファイルのプロパティを調査(2)

先の指定から-nameオプションを削除した場合

javapackager -deploy -native msi -v `
-outdir dist -outfile OutFile `
-srcdir dist -srcfiles AnalogClockSvg.jar `
-appclass analogclocksvg.AnalogClockSvg `
-BappVersion="0.1.3" `
-title "Title Option" `
-vendor Vendor `
-description "Description Option" 
  • 生成されたMSIファイル名
    AnalogClockSvg-0.1.3.msi
  • MSIファイルのプロパティ > 詳細
    • タイトル
      Installation Database
    • 件名
      Description Option
    • コメント
      None
    • 作成者
      Vendor
  • インストールディレクトリ
    C:\Program Files\AnalogClockSvg
  • 実行ファイル名
    C:\Program Files\AnalogClockSvg.exe
  • スタートメニュー
    すべてのプログラム > Vendor > AnalogClockSvg
  • コントロールパネル > プログラムのアンインストールまたは変更
    • 名前
      AnalogClockSvg
    • 発行元
      Vendor
    • バージョン
      0.1.3

高橋 徹 さんがほぼ8年前に更新

javapackagerのオプションと生成されるMSIファイルのプロパティを調査(3)

  • (2)から、JARファイル名を変更し、-srcfiles AnalogClockSvgAlfa.jar として実行
    → 変化無し
  • (3)から、-outfileオプションを削除して実行
    Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: エラー: 引数がありません: -outfile
    

高橋 徹 さんがほぼ8年前に更新

javapackagerのオプションと生成されるMSIファイルのプロパティを調査(4)

別なプログラムで、アプリケーション実行クラス名がMainとなるもので実験。

javapackager -deploy -native msi -v `
-outdir dist -outfile OutFile `
-srcdir dist -srcfiles Canvas.jar `
-appclass canvas.Main `
-BappVersion="0.1.0" `
-title "Title Option" `
-vendor Vendor `
-description "Description Option" 

Main-0.1.0.msi
C:\Program Files\Main
C:\Program Files\Main\Main.exe
すべてのプログラム > Vendor > Main
コントロールパネル: Main Vendor 0.1.0

高橋 徹 さんがほぼ8年前に更新

  • 題名JavaFXネイティブパッケージの作り方(Windows MSI形式) から Javaネイティブパッケージの作り方(Windows MSI形式) に変更

高橋 徹 さんがほぼ8年前に更新

高橋 徹 さんがほぼ8年前に更新

javapackagerで作成したインストーラーは、アップグレード対応できない。

バージョン番号を増分してインストーラを生成しても、古いバージョンのアプリケーションがインストールされた状態で新しいバージョンのインストーラを実行すると、古いバージョンはそのままに新しいバージョンがインストールされてしまいます。

これは、WiX ToolsetでUpgradeCodeのIDがバージョン間で一致しないためです。
一致させるためには、何らかの形でUpgradeCodeを指定する必要があります。

javapackagerコマンドや、antのjfx-deployタスクのオプションを見る限り、UpgradeCodeに関する指定は見当たりません。
そこで、javapackagerのソースコードを調べてみます。

-Bwin.msi.upgradeUUID="2126e41e-9bb9-4f22-81e3-539049b46086"
    <Product Id="ebaf8ad5-fb0a-4b78-8613-d16f74cc8930" Name="JarManifestViewer" 
             Language="1033" Version="1.0" 
             Manufacturer="Torutk" 
             UpgradeCode="2126e41e-9bb9-4f22-81e3-539049b46086">

ただし、これだけではアップグレード対応にはなりません。

これでしょうか? OpenJFXのjfxpackagerのソースコードです。
http://hg.openjdk.java.net/openjfx/9-dev/rt/file/5749594ab756/modules/fxpackager/src/main/java/com/oracle/tools/packager/windows/WinMsiBundler.java

132行目に次のコードがありました。

    public static final BundlerParamInfo<UUID> UPGRADE_UUID = new WindowsBundlerParam<>(
            I18N.getString("param.upgrade-uuid.name"),
            I18N.getString("param.upgrade-uuid.description"),
            "win.msi.upgradeUUID",
            UUID.class,
            params -> UUID.randomUUID(), // TODO check to see if identifier is a valid UUID during default
            (s, p) -> UUID.fromString(s));

そこで、試しにjavapackagerコマンドのオプション -Bwin.msi.upgradeUUIDを指定してみたところ、一時生成されるwxsファイルの中身に指定したUUIDが記述されているのが確認できました。

ただし、これだけではアップグレード対応になりません。

補足

OpenJFXのソースを見回すと、WXSファイルのテンプレートは次にありました。

http://hg.openjdk.java.net/openjfx/9-dev/rt/file/5749594ab756/modules/fxpackager/src/main/resources/com/oracle/tools/packager/windows/template.wxs

テンプレートには<MajorUpgrade>要素がないのでアップグレード対応ができないので、テンプレートをいじって対応することにします。
template.wxs にMajorUpgrade要素を追加します。


     <Package Description="APPLICATION_DESCRIPTION" Comments="None" 
              InstallerVersion="200" Compressed="yes" 
              InstallScope="INSTALL_SCOPE" Platform="PLATFORM"/>
+    <MajorUpgrade DowngradeErrorMessage="Already new [ProductName] insatlled. Stopping to install." />
     <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" />

これを、javapackagerを実行するカレントディレクトリ下のpackage\windows\<名前>.wxs として保存します。
すると、javapackagerがテンプレートとしてこのファイルを使用するので、生成されるインストーラーファイルはメジャーアップグレードが可能となります。

高橋 徹 さんがほぼ8年前に更新

32bit版インストーラ(MSI)を作る方法を模索

Windows 7 64bit OS上で、JDK 8u92 32bit版のjavapackagerを実行してみたところ、

  • インストールされたexeファイル(AnalogClock.exe)は64bit版
  • インストールされたdllファイルは32bit版(msvcp120.dllほか)

と、不整合が発生した。

-Bwin.64Bit=false を指定し、JDK 8u92 32bit版javapackager実行
これはOK

環境変数JAVA_HOMEはなくてもよいが、定義している場合はjavapackagerコマンドのJDKと同じ場所を指定することが必要。

高橋 徹 さんが5年以上前に更新

  • ステータス進行中 から 解決 に変更
  • 進捗率50 から 80 に変更

JKD 8では一応インストーラーが生成できることろに達した。

JDK 11からはjavapackagerがJDKから削除されたので、いったん終了とする。

高橋 徹 さんが5年以上前に更新

  • ステータス解決 から 終了 に変更
  • 進捗率80 から 100 に変更

他の形式にエクスポート: Atom PDF