プロジェクト

全般

プロフィール

Javapackager

JDK 11以降は搭載されなくなりました
  • 代替えの仕組みは、jpackage参照

[#24]で調査活動中

はじめに

javapackagerは、javaのプログラムをデプロイ(配布)用にパッケージングするツールで、JDK 8u20においてそれまでのjavafxpackagerから名前を変えて搭載されるようになりました。主に次の機能を持ちます。

  • CSSファイルをバイナリ形式変換
  • JARアーカイブファイルの生成
  • 配布用パッケージの生成

ドキュメント

Oracleドキュメント

Java SE 8 の javapackager ドキュメント

Java SE 9 の javapackager ドキュメント

自己完結型アプリケーションのパッケージを作成

MSI形式を作成(非Jigsaw)

最小限の設定

インストーラーに含めるファイル、生成するMSI形式ファイルの場所と名前、プログラム実行時に呼び出すmainメソッドを持つクラス名(FQCN)を指定します。

> javapackager -deploy -native msi 
-outdir dist -outfile JarManifestViewer 
-srcdir dist -srcfiles jarmanifestviewer.jar
-appclass com.torutk.jarmanifest.JarManifestViewer

実行すると、dist\bundlesディレクトリが作成され、その下に JarManifestViewer-1.0.msi ファイルが生成されます1
この JarManifestViewer-1.0.msi ファイルのプロパティ > 詳細を開くと次のようになります。

minimum_msi_property_detail-1.png

コメントがNone、作成者がUnknownと残念な表示です。

生成されたインストーラーを実行すると、C:\Program Files\JarManifestViewer ディレクトリにインストールされます。

C:\Program Files\JarManifestViewer
  +-- app
  |     +-- JarManifestViewer.cfg
  |     +-- jarmanifestviewer.jar
  +-- runtime
  :     :
  +-- JarManifestViewer.exe
  +-- JarManifestViewer.ico
  +-- msvcp120.dll
  +-- msvcr100.dll
  +-- msvcr120.dll
  +-- packager.dll

スタートメニューには次のようにUnknownの下にショートカットが登録されています。

minimum_msi_startmenu-1.png

1 -outfileオプションではなく、-appclassで指定したクラスの単純名(パッケージ名を除いたクラス名)が適用

コマンドラインオプションの反映先

  • -outdir dist
    必須オプションでインストーラーファイル(*.msi)が生成されるルートディレクトリ。この下にbuldlesフォルダが作られ、その中にインストーラーファイルが作られた
  • -outfile JarManifestViewer
    必須オプションだが、この指定はインストーラーファイル名には反映されなかった(-nameオプション指定時はその名称、-nameオプション未指定時は-appclassのクラス名部分が反映)
  • -srcdir dist
    必須オプションでインストーラーに含めるファイル群がある場所のルートディレクトリ。
  • -srcfiles jarmanifestviewer.jar
    必須オプションでインストーラーに含めるファイル群を-srcdirで指定したルートからの相対パスで指定する。複数指定時は空白区切りとする。実行可能JAR形式ファイルを1つ含むこと。
    → Windows版JDK 8u131では、空白区切りでJARファイルを複数してしてもエラーとなってしまいました。セミコロン区切りであれば複数JARファイルの指定が可能でした。
    • -srcfiles alfa.jar bravo.jar -> NG
    • -srcfiles "alfa.jar bravo.jar" -> NG
    • -srcfiles alfa.jar;bravo.jar -> OK
  • -appclass canvas.Main
    必須オプションで実行可能JARのMainClassを指定。
  • -vendor Vendor
    MSIファイルのプロパティ > 詳細の作成者、コントロールパネルのプログラム一覧の発行元に記載される名称。-Bwin.menuGroupオプション未指定時はこのオプションがスタートメニューのフォルダ名に反映される。
  • -description "Description Option"
    MSIファイルのプロパティ > 詳細の件名に記載される文字列
  • -title "Title Option"
    どこに反映されるか不明(調査中)
  • -name NameOption
    これを指定すると、インストーラーファイルの基底名(バージョン番号と拡張子を除いた部分)、実行ファイル(.exe)名、ショートカット名、コントロールパネルのプログラム一覧の名前に反映される
  • -BappVersion=1.0.4
    インストーラーファイルのバージョン名部分、コントロールパネルのプログラム一覧のバージョンに反映される
  • -Bwin.menuGroup="Vendor App"
    スタートメニューのショートカットが含まれるフォルダ名に反映される
  • -Bicon=MyApp.ico
    実行ファイル、ショートカットのアイコンに反映される
  • -BmenuHint=false
    スタートメニューへのショートカット登録有無をtrue|falseで指定、デフォルトはtrue
  • -BshortcutHint=true
    デスクトップへのショートカット登録有無をtrue|falseで指定、デフォルトはfalse
  • -Bwin.64Bit=false
    インストーラーファイルとその中のバイナリを64bit版とするかどうかtrue|falseで指定、デフォルトは

WiX Toolsetのソーステンプレート

JDK 8のjavapackagerに含まれるWiX Toolsetのソーステンプレートtemplate.wxsは、JDKインストールディレクトリ下のlib/ant-javafx.jarに含まれます。また、
OpenJFXのソースコードリポジトリで閲覧できます。
http://hg.openjdk.java.net/openjfx/8u/rt/file/105417e52ffe/modules/fxpackager/src/main/resources/com/oracle/tools/packager/windows/template.wxs

このtemplate.wxsに手を入れ、javapackagerコマンドを実行するカレントディレクトリ下にpackage\windowsフォルダを作成、手を入れたtemplate.wxsをその中にアプリケーション名(-nameオプションで指定した名前)に変えて置きます(JarManifestViewer.wxs など)。

すると、javapackager実行時に当初のテンプレートに替えてテンプレートとして使用されます。

メジャーアップグレード対応

WiXソースのテンプレート(template.wxs)に手を入れてメジャーアップグレード対応をします。


     <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フォルダを作成します。
そこに、修正したtemplate.wxsを、アプリケーション名.wxsの名前で保存します(例:JarManifesetViewer.wxs)。

javapackagerコマンド実行時は、-Bwin.msi.upgradeUUID="2126e41e-9bb9-4f22-81e3-539049b46086"のようにバージョンをまたがって同一のIDを指定します。

  • JarManifestViewer.wxsのProduct要素のUpgradeCodeに直書きするのもよいでしょう
UUIDの生成方法

Windowsデスクトップ環境でUUID(GUID)を生成する方法

64bit環境で32bit用インストーラーを作成

64bit OS上で、32bit版JDKを用いて32bit用のインストーラーを作成する場合の設定です。

  • 32bit版JDKのjavapackagerを実行する
  • 環境変数JAVA_HOMEは未定義とするか、32bit版JDKのルートディレクトリを設定する

javapackagerのソースコード(OpenJFX)を読むと、システムプロパティos.arch64という文字列が含まれているかどうかで64bit版インストーラーを生成するか32bit版インストーラーを生成するか決めています。

JDK 8u92でシステムプロパティos.archの値は、32bit版ではx86、64bit版ではamd64となっていたので、32bit版JDKを使えばよいはずです。

なお、環境変数JAVA_HOMEが64bit版JDKを指していると、32bit版javapackagerを実行したときにエラーとなります。

構成の問題のため、バンドラMSIインストーラがスキップされました: Bit architecture mismatch between FX SDK and JRE runtime.  
次の修正を行ってください: Make sure to use JRE runtime with correct bit architecture.

MSI形式を作成(Jigsaw)

最小限の設定

インストーラーに含めるモジュール、生成するMSI形式ファイルの場所と名前、を指定します。

> javapackager -deploy -native msi -v
-outdir dist -outfile hellofx
--module-path dist 
--module com.torutk.hello/com.torutk.hello.HelloApp

メモ

自己完結型アプリケーション作成時

アプリケーション起動時のJVMオプション指定方法

コマンドラインで-BuesrJvmOptionsで指定します。

-BuserJvmOptions=-Xms=64m
-BuserJvmOptions=-Xmx=256m

Jigsaw対応

Jigsaw で導入される module を使う方法の調査メモ

JEP 275のドキュメントより

Jigsaw対応として、次のオプションが導入されました。

--add-modules <module>(,<module>)*
--limit-modules <module>(,<module>)*
--module-path <path>(:<path>)*
-p <path>(:<path>)*
--module <module>/<classname>
-m <module>/<classname>
  • --moduleと--module-pathは必須
  • --moduleを指定するときは、-appClassと-BmainJar=は指定できません(相互排他的指定)
  • --module-path は、使用するライブラリ、JDK標準ライブラリ、アプリケーションのモジュールへのパスを指定します。
    JDK標準ライブラリのモジュールパスを省略すると、javapackagerを実行しているJDKのものが使われます。($JAVA_HOME/jmods)
    アプリケーションのモジュールへのパスは必須指定です。アプリケーションのモジュールは--moduleで指定します。
    アプリケーションのモジュール以外のモジュールは、--add-modulesや--limit-modulesで指定できます。
    動的に(実行時に)ロードするモジュールは、--add-modulesで指定する必要があります。
    メインのモジュールと--add-modulesで指定したモジュールは、ルートモジュールとして定義されます。
  • コマンドラインオプション --add-modules は、依存解決のルートとなるモジュール群を指定します。ALL-MODULE-PATHを指定すると、モジュールパス上のすべてのモジュールが指定されます。
  • Jigsaw非対応アプリケーションで使用するオプション
    -appClass
    -BmainJar=
    -srcfiles
    -Bclasspath=
    


約3年前に更新