本文へスキップ

Java アプリの Windows インストーラー、jpackage から Setup.exe まで

jpackage で JAR と Java ランタイムをネイティブ .exe 付きのフォルダーにまとめ、そのフォルダーを WiX ツールセットなしで Windows インストーラーにする方法。

更新日 2026年10月31日 · 読了 6 分

「先に Java をインストールしてください」とは、顧客に言いたくない言葉です。JDK 14 以降、jpackage が問題の半分を解決してくれます。アプリケーションを必要最小限に絞った Java ランタイムと一緒にまとめ、ネイティブの MyApp.exe を生成してくれるのです。残りの半分である Windows インストーラーについては、jpackage は WiX ツールセットをインストールしてその癖を覚えるよう求めてきます。このガイドでは、jpackage が生成したフォルダーをそのまま使い、それらを一切抜きにして Setup.exe に仕上げます。

ステップ 1: アプリケーションイメージをビルドする

実行可能 JAR と依存する JAR を 1 つのフォルダー(以下では lib/)に置き、Windows 上で jpackage を実行します。

jpackage --type app-image --name MyApp --input lib --main-jar myapp.jar --main-class com.example.Main --icon app.ico --app-version 2.4.0

これにより、次の内容を持つ MyApp/ が作成されます。

  • MyApp.exe:アイコン付きのネイティブランチャー
  • app/:JAR ファイルと設定ファイル
  • runtime/:アプリに必要なモジュールだけを含む Java ランタイム

JavaFX アプリの場合は、JavaFX SDK の lib フォルダーを指す --module-path と、--add-modules javafx.controls,javafx.fxml(使用するモジュールに合わせて調整)を追加します。モジュール化されたアプリでは、--main-jar の代わりに --module を使います。

MyApp\MyApp.exe を開き、システムに Java がインストールされていなくてもアプリが起動することを確認してください。それを可能にしているのが runtime/ フォルダーです。

Windows 用のイメージを生成するには、jpackage を Windows 上で実行する必要があります。Windows マシン、仮想マシン、CI の Windows ランナーのいずれでも構いません。選択肢については Mac でビルドする を参照してください。

ステップ 2: イメージを zip にする

MyApp/ の中身、つまり MyApp.exe、app/、runtime/ を zip にします。構造はそのまま保ってください。ランチャーは app/ と runtime/ が自分の隣にあることを前提にしています。

ステップ 3: インストーラーをビルドする

  1. zip を ExeTup にアップロードします。メインプログラムとして MyApp.exe が選ばれます。
  2. 名前、--app-version に指定したものと同じバージョン、発行元の名前を入力します。
  3. すべてのユーザー(Program Files、管理者プロンプトあり)または現在のユーザー(プロンプトなし)を選びます。従業員に配布する業務用 Java アプリはユーザー単位のインストールが多く、一般消費者向けアプリは通常マシン単位です。
  4. 64 ビットのままにします。jpackage は JDK のアーキテクチャに合わせてビルドし、ほぼすべてのマシンで x64 です。
  5. app.ico をアップロードし、ショートカットを有効にして、ビルドします。

出来上がるのは、アプリケーションイメージを配置し、スタートメニューの項目とアンインストーラーを備えた Windows インストーラーです。顧客が Java を目にすることはありません。

jpackage にインストーラーを作らせない理由

jpackage --type exe や --type msi でもインストーラーは作れますし、それで十分なチームもあります。ただし、WiX Toolset 3 をインストールして PATH に通す必要があり、ウィザードは固定でオプションも限られ、アンインストーラーやショートカットの挙動には WiX に深入りしないと直しにくい粗い部分があります。app-image と別のインストーラーを使えば、2 つの関心事を切り離せます。jpackage は得意なランタイムのバンドルを担当し、インストーラーが Windows との統合を担当します。

Java 固有の注意点

  • ランタイムのサイズ。 絞り込んだランタイムは 40〜80 MB です。jlink 方式のモジュール削減は自動で行われ、--jlink-options --strip-debug と --jlink-options --no-man-pages でもう少し削れます。
  • Java オプション。 JVM フラグはイメージのビルド時に --java-options "-Xmx1g" で渡します。ランチャーの設定に埋め込まれます。
  • 更新。 より高いバージョンの新しいインストーラーを配布します。前のバージョンに上書きインストールすると、app/ と runtime/ がその場で置き換わります。
  • Launch4j などの同種ツールは JAR を .exe で包みますが、既定ではランタイムを同梱しないため、「Java をインストールする」手順はなくなりません。jpackage ならなくなります。
  • 署名。 zip にする前に MyApp.exe に署名し、ダウンロードした Setup.exe にはその後で署名します。SmartScreen のガイドを参照してください。

よくある質問

顧客側に Java のインストールは必要ですか?

不要です。jpackage が作成する runtime/ フォルダーにアプリに必要なものがすべて含まれており、インストーラーがそれをアプリと一緒に配布します。

WiX ツールセットなしでアプリをインストールできますか?

できます。WiX が必要なのは jpackage 自身の exe と msi タイプだけです。代わりに app-image をビルドし、インストーラーには ExeTup を使ってください。

JavaFX でも使えますか?

使えます。イメージのビルド時に JavaFX のモジュールを含め、MyApp.exe をテストしてから、上記のとおりフォルダーをパッケージしてください。

Temurin など別の JDK を同梱できますか?

jpackage は、自身を実行している JDK をランタイムとして使います。配布したい JDK から実行するか、jlink でビルドしたランタイムを --runtime-image で渡してください。

関連ガイド