OpenJDKでJavaアプリ配布パッケージを作る

Java 7 以降の Oracle JDK には javapackager という Java アプリケーション配布パッケージを作成するツールが付属していたのですが 残念なことに OpenJDK には javapackager は含まれていません。

今回は javapackager を使わずに OpenJDK Java アプリケーション配布パッケージを作成する方法を紹介します。作成するパッケージには Java アプリの実行に必要な JRE Java Runtime Environment が含まれるようにして 配布パッケージを展開するだけで Java アプリを実行できるようにします。

開発環境を準備してサンプルアプリを用意する

前回の記事 Java 11 + Eclipse JavaFX アプリ開発 を参照して OpenJDK + Eclipse Java アプリケーションの開発環境を準備します。

実行可能 JAR を作成する

前回の記事 Java 11 + Eclipse JavaFX アプリ開発 で作成した JavaFX のサンプルプログラムを例としてパッケージ作成の手順を説明していきます。

最初に サンプルプログラムを実行可能 JAR ファイルにまとめます。

実行可能 JAR ファイルを作成する方法はいろいろとあります。今回は Eclipse から GUI 操作で実行可能 JAR を作成する手順を説明しますが Ant Gradle Maven を使いこなしている場合は実行可能 JAR の作成までビルド スクリプトで自動化してしまうのが良いと思います。

Eclipse で実行可能 JAR を作成する場合は プロジェクトを右クリックして Export... を選択します。

何をエクスポートするのか選択するダイアログが表示されます。Java を展開して Runtime JAR file を選択して Next > をクリックします。

実行可能 JAR ファイルの内容を指定するダイアログが表示されます。

Launch configuration
ここにメインクラスを指定します。Eclipse 上でアプリケーションを実行していない場合 ここに何も表示されません。少なくとも一度は Eclipse 上でサンプルアプリケーションを実行しておいてください。
Export destination
ここには実行可能 JAR の出力ファイル名をワークスペースからの相対パスで指定します。Browse... ボタンを使うと出力フォルダーを簡単に指定できます。それでも出力ファイル名の入力は必要です
Library handling
アプリケーションが依存しているライブラリの出力方法を指定します。依存ライブラリがサブフォルダーにコピーされる Copy required libraries into a sub-folder next to the generated JAR を選択します。

最後に Finish をクリックします。

これで プロジェクトフォルダーに fx-sample.jar が作成されます。fx-sample_lib というフォルダーも作成されています。このフォルダーにはアプリケーションの依存ライブラリがコピーされますが 今回のサンプルアプリには依存ライブラリがないので空っぽです。

アプリ実行用の JRE を作成する

次に 実行可能 JAR fx-sample.jar の実行に必要な JRE Java 実行環境 を作成します。

JavaConsole.bat をダブルクリックしてコマンドプロンプトを起動します。

コマンドプロンプト
openjdk version "11.0.1" 2018-10-16 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.1+13, mixed mode) ------------------------------------------------------------------------------ ListProjects … Subversionリポジトリのプロジェクト一覧を表示します。 ImportProject … 指定したプロジェクトをSubversionリポジトリに登録します。 CheckoutProject … Subversionリポジトリから指定したプロジェクトを取得します。 ExportProject … 指定したローカルのプロジェクトをZIP形式で圧縮します。 CreateJRE … JREを作成します。引数にJARファイルを指定するとJARファイル が依存するモジュールのみを含むJREが作られます。引数を省略 するとjdkを除くすべてのモジュールを含むJREが作られます。 usage … このヘルプメッセージをもう一度表示します。 ------------------------------------------------------------------------------ C:¥Java>

サンプルアプリのプロジェクトフォルダー workspace¥fx-sample に移動してから CreateJRE コマンドを実行して fx-sample.jar の実行に必要な JRE Java 実行環境 を作成します。

コマンドプロンプト
C:¥Java>cd workspace¥fx-sample C:¥Java¥workspace¥fx-sample>CreateJRE fx-sample.jar java.base javafx.base javafx.controls javafx.graphics Creating: jre-11.0.1 Done.

CreateJRE jdeps jlink コマンドを使って JRE を作成するバッチファイルです。前回の記事 Java 11 + Eclipse JavaFX アプリ開発 で導入した JavaTools.zip に含まれています。jdeps jlink について詳しく知りたい場合は アプリケーション配布用に小さな JRE を作る も参照してみてください。

CreateJRE コマンドを実行したことで JRE が作成されました。JRE のフォルダー名には OpenJDK と同じバージョン番号が付きます。今回は OpenJDK 11.0.1 を使用したので jre-11.0.1 というフォルダー名になりました。

実行可能 JAR EXE に変換する

最後に 実行可能 JAR fx-sample.jar Windows の実行ファイル fx-sample.exe に変換します。

実行ファイル(EXE)への変換には exewrap を使用します。exewrap をダウンロードして ZIP ファイルを展開して x64¥exewrap.exe PATH の通っている場所にコピーします。JavaTools を展開した場所 C:¥Java¥tools にコピーするのがおすすめです。JavaConsole.bat によって自動的に PATH が設定されるので

JavaConsole.bat で起動したコマンドプロンプトで サンプルアプリのプロジェクトフォルダー workspace¥fx-sample に移動した状態で exewrap コマンドを実行します。

コマンドプロンプト
C:¥Java¥workspace¥fx-sample>exewrap -g fx-sample.jar Architecture: x64 (64-bit) Target: Java 5.0 (1.5.0.0) fx-sample.exe (64-bit) version 0.0.0.1

サンプルアプリが JavaFX で作成した GUI アプリケーションだったので exewrap の引数に -g を指定しました。コンソールアプリケーションを作成する場合は引数 -g を付ける必要はありません。exewrap には他にもアプリのアイコンやバージョン コピーライトを埋め込むオプションなど様々な機能が用意されています。詳細については exewrap のサイトを確認してみてください。

これで fx-sample.exe ができました。

fx-sample.exe をダブルクリックするとサンプルアプリが起動します。

アプリ配布に必要なファイル

先程はプロジェクトフォルダー内でアプリを実行してみましたが 実際にアプリの実行に必要なのは fx-sample.exe jre-11.0.1 フォルダーの 2 つです。

適当なフォルダー C:¥temp¥fx-sample を作成して そこに fx-sample.exe jre-11.0.1 フォルダーをコピーします。

もう一度 fx-sample.exe をダブルクリックして実行してみましょう。

実行できました! 問題ありません。これでアプリ実行に必要な JRE を含むパッケージが作成できました。後は C:¥temp¥fx-sample フォルダーを ZIP 形式に圧縮して配布することができます。

ちなみに 今回のサンプルアプリのケースでは JRE フォルダーのサイズが 44MB。実行ファイルと一緒にまとめて ZIP 形式に圧縮して 31MB になりました。ランタイム込みの Java アプリケーションとしてはかなりサイズが抑えられていると思います。これは Java 9 で導入されたモジュール機能 Project Jigsaw のおかげですね。


このように専用のインストーラーを必要とせず フォルダーをまるごとコピーするだけで実行できるアプリケーションを xcopy deployment xcopy installation と呼びます。この呼び名は xcopy コマンドでコピーするだけで動くことに由来しています。実際には xcopy コマンドを使わずに ZIP ファイルを展開するだけの構成でも このように呼ばれています。

ファイル一式をコピーするだけで動作するシンプルな構成なので InstallShield Visual Studio Installer Project WiX InnoSetup NSIS など他のツールと組み合わせてインストーラーを作るのことも難しくありません。

今回は配布用パッケージ フォルダー を作成するところまでの説明となりましたが 次回はこの配布用パッケージを Desktop Bridge UWP 化して .appx X 形式にする手順を紹介します。UWP 化すると Java アプリケーションを Microsoft Store を通して配布できるようになります。