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: インストーラーをビルドする
- zip を ExeTup にアップロードします。メインプログラムとして
MyApp.exeが選ばれます。 - 名前、
--app-versionに指定したものと同じバージョン、発行元の名前を入力します。 - すべてのユーザー(Program Files、管理者プロンプトあり)または現在のユーザー(プロンプトなし)を選びます。従業員に配布する業務用 Java アプリはユーザー単位のインストールが多く、一般消費者向けアプリは通常マシン単位です。
- 64 ビットのままにします。jpackage は JDK のアーキテクチャに合わせてビルドし、ほぼすべてのマシンで x64 です。
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 で渡してください。
関連ガイド
- Windows アプリの Setup.exe を作る方法(コード不要)Setup.exe が実際に行うこと、作成する3つの方法、そしてインストーラースクリプトを書かずにアプリのフォルダーを数分でプロ品質のインストーラーに変える方法を解説します。
- .exe を Windows インストーラーにする方法(exe から Setup.exe へ)単体の .exe や .exe を含むフォルダーを、インストーラースクリプトを書かずに、ショートカットとアンインストーラー付きの本格的な Windows インストーラーに変換する方法。
- .NET アプリ(WPF・WinForms・コンソール)の Windows インストーラーを作るdotnet publish で .NET デスクトップアプリを発行し、フレームワーク依存と自己完結型のどちらかを選び、発行フォルダーをショートカットとアンインストーラー付きの Setup.exe にまとめる手順。