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 を通して配布できるようになります。