Javapackager¶
JDK 11以降は搭載されなくなりました |
- 代替えの仕組みは、jpackage参照
[#24]で調査活動中
はじめに¶
javapackagerは、javaのプログラムをデプロイ(配布)用にパッケージングするツールで、JDK 8u20においてそれまでのjavafxpackagerから名前を変えて搭載されるようになりました。主に次の機能を持ちます。
- CSSファイルをバイナリ形式変換
- JARアーカイブファイルの生成
- 配布用パッケージの生成
ドキュメント¶
Oracleドキュメント¶
Java SE 8 の javapackager ドキュメント¶
- Java Platform, Standard Editionツール・リファレンス javapackager for Windows
- Java Platform, Standard Editionデプロイメント・ガイド
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 ファイルのプロパティ > 詳細を開くと次のようになります。
コメントが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の下にショートカットが登録されています。
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.arch
に64
という文字列が含まれているかどうかで64bit版インストーラーを生成するか32bit版インストーラーを生成するか決めています。
- http://hg.openjdk.java.net/openjfx/8u/rt/file/105417e52ffe/modules/fxpackager/src/main/java/com/oracle/tools/packager/windows/WindowsBundlerParam.java#l95
public static final StandardBundlerParam<Boolean> BIT_ARCH_64 = new StandardBundlerParam<>( I18N.getString("param.64-bit.name"), I18N.getString("param.64-bit.description"), "win.64Bit", Boolean.class, params -> System.getProperty("os.arch").contains("64"), (s, p) -> Boolean.valueOf(s) );
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=