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

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

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

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

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

実行可能JARを作成する

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

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

実行可能JARファイルを作成する方法はいろいろとあります。今回は、EclipseからGUI操作で実行可能JARを作成する手順を説明しますが、AntGradleMaven を使いこなしている場合は実行可能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.

CreateJREjdepsjlinkコマンドを使ってJREを作成するバッチファイルです。 前回の記事で導入した JavaTools.zip に含まれています。jdepsjlinkについて詳しく知りたい場合は、 アプリケーション配布用に小さな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.exejre-11.0.1フォルダーの2つです。

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

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

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

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


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

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

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