Windows EXE ランチャーの生成

パッケージング時に、保護されたアプリケーション用のネイティブ Windows ランチャーを生成できます。純粋な Win32 実行ファイルで、ダブルクリックするだけで動くため、利用者が事前に Java をインストールする必要も、run.bat を意識する必要もありません。

EXE は任意で、既定では生成されません。有効にした場合も、パッケージには run.shrun.commandrun.bat がそのまま残ります。どちらの起動方法でも、アーカイブ構成、クラスパス、メインクラス、JVM スタートアップオプションはまったく同じです。

1. 適用範囲

アプリケーションの種類Java アプリケーション、Spring Boot (3 つのレイアウトすべて)、Tomcat
ターゲットプラットフォームwindows-x64windows-x86windows-aarch64
非対応ライブラリ暗号化 — 単一の .p4jx アーカイブは実行可能なアプリケーションディレクトリではありません

Windows のターゲットプラットフォームを 1 つ以上選ぶ必要があります。Linux や macOS のターゲットを同時に選んでも問題ありません。それらのパッケージは EXE なしで通常どおり生成され、従来のスクリプトから起動します。Windows のターゲットを 1 つも選んでいない場合は、タスクがすぐに失敗します。

2. GUI での操作

  1. 入力ファイルとターゲットプラットフォームのページで Windows アプリケーション EXE を生成 (x64/x86/ARM64) にチェックを入れ、Windows のターゲットプラットフォームを 1 つ以上選びます。
  2. このチェックボックスはシンプルモードと詳細設定モードの分岐より前にあるため、どちらのモードでも EXE を生成できます。
  3. チェックを入れると Windows EXE ランチャーページが追加され、ファイル名、ランチャーモード、アイコン、Windows バージョン情報を入力できます。チェックしない場合は、そのまま最終確認ページに進みます。
  4. EXE を有効にすると、JVM スタートアップオプションの入力欄はこのランチャーページにのみ表示されます。同じオプションの入力欄が 2 か所に現れないようにするためです。入力した内容は EXE と起動スクリプトの両方に書き込まれます。
  5. 最終確認ページには、実際に EXE が生成されるプラットフォームと、入力したランチャーの項目が表示されます。

3. CLI の例

最小の形は --windows-exe だけです。

p4j --target-platform windows-x64 javaapp app.jar dist --windows-exe

ファイル名とウィンドウモードを指定する場合:

p4j --target-platform windows-x64 javaapp app.jar dist \
  --windows-exe \
  --exe-name MyApp.exe \
  --exe-mode gui \
  --exe-icon assets/app.ico

3 つの Windows アーキテクチャをまとめて生成し、バージョンリソースを揃える場合:

p4j --target-platform windows-x64,windows-x86,windows-aarch64 \
  springboot app.jar dist \
  --windows-exe \
  --exe-name MyService \
  --exe-file-version 1.4.2.0 \
  --exe-product-version 1.4.2.0 \
  --exe-company 'Example Inc.' \
  --exe-product 'Example Service' \
  --exe-description 'Example background service' \
  --exe-copyright 'Copyright (C) 2026 Example Inc.'

Tomcat のパッケージにも対応しています。生成される EXE は組み込み Tomcat をフォアグラウンドで起動します。

p4j --target-platform windows-x64 tomcat app.war dist --context /demo --windows-exe

4. オプション

オプション説明
--windows-exeWindows アプリケーション EXE を生成します
--exe-name <name>EXE のファイル名。既定は入力ファイル名、Tomcat のパッケージでは tomcat
--exe-mode <mode>console (既定) または gui
--exe-icon <ico>任意の Windows アイコン (.ico 形式)
--exe-file-version <a.b.c.d>PE のファイルバージョン。1〜4 個の数値で、各値は 0〜65535。空欄は 0.0.0.0 を意味します
--exe-product-version <a.b.c.d>PE の製品バージョン。規則は同じです
--exe-company <text>会社名
--exe-product <text>製品名
--exe-description <text>ファイルの説明。タスクマネージャーとファイルのプロパティに表示されます
--exe-copyright <text>著作権表示

--exe-* のいずれかを指定すると EXE の生成が自動的に有効になるため、--windows-exe を併記する必要はありません。

名前はファイル名のみで、/\、ディレクトリ部分を含められません。.exe を省略した場合は自動的に補われます。

2 つのバージョン項目は同じ規則に従います。半角ピリオドで区切った 1〜4 個の数値で、各値は 0〜65535 です (例:1.0.0.1)。Windows は各要素を 16 ビットの符号なし整数として保存するため、v1.01.0-beta のように文字や空白を含む値は受け付けません。空欄は 0.0.0.0 を意味します。この 2 項目はパッケージング開始前に検証されるため、誤りは途中ではなくその場で分かります。

5. 出力の構成

Java アプリケーションを例にすると、EXE は起動スクリプトと並んでパッケージのルートに配置されます。

dist/
├── MyApp.exe             # 追加された Windows ランチャー
├── app.p4jx
├── vlxjre/
├── lib/
├── run.sh
├── run.command
├── run.bat
└── README.md

パッケージ内の README.md には、生成された EXE のファイル名と、コード署名に関する注意が記載されます。

6. ランチャーの挙動

EXE が置かれたディレクトリがアプリケーションのルートになります。ランチャーは、そのルート内にあるランタイム、アーカイブ、クラスパス、作業ディレクトリのパスだけを受け付けます。パッケージ外のパスや、シンボリックリンク・ジャンクションで差し替えられたパスは拒否され、プロセスは起動しません。したがってパッケージ全体を移動したり名前を変えたりするのは自由ですが、EXE だけを取り出してコピーすることはできません。

項目挙動
ランタイム常にパッケージ内の vlxjre\bin\java.exe を使います。システムの Java は使わず、JAVA_HOME も読みません。
コマンドライン引数EXE に渡した引数は、アプリケーション自身の引数の後に追加されます。
コンソールモード現在のコンソールの標準入出力を引き継ぎ、アプリケーションの終了を待ち、その終了コードを返します。
GUI モードコンソールウィンドウを作らないため、デスクトップアプリケーションに向いています。
環境変数起動前に JAVA_TOOL_OPTIONS_JAVA_OPTIONSJDK_JAVA_OPTIONSCLASSPATH をクリアし、外部から起動オプションを注入されないようにします。

EXE の JVM オプションはパッケージング時に固定され、パラメーターブロックとともに署名されて実行時に検証されるため、配備後に変更することはできません。APP_JAVA_OPTS が影響するのは run.bat だけで、EXE はこれを読みません。EXE の JVM オプションを変更するには、パッケージングをやり直してください。

同じ理由から、-javaagent-agentlib-agentpath-Xbootclasspath--patch-module は EXE の起動オプションに書き込めません。これらを --jvm-option で渡すと、パッケージングはその場で失敗します。

7. コード署名

Protector4J は生成した EXE に発行元の署名を付けず、Authenticode の資格情報にも一切触れません。アイコン、バージョンリソース、起動オプションといった PE の変更はすべてパッケージング時に完了するため、署名は最後の工程になります。

  1. パッケージングを完了し、EXE からアプリケーションが正しく起動することを確認します。
  2. 自分の証明書で Authenticode 署名を行い、RFC3161 のタイムスタンプを付与します。
  3. Windows の /pa ポリシーで署名を検証します。

署名後は PE ファイルを変更しないでください。変更すると署名が無効になります。アイコンやバージョン番号を変える場合は、パッケージングと署名をやり直してください。

8. タスクファイルの項目

エクスポートされる p4j-task.yml はフォーマットのバージョン 2 を使い、EXE を有効にすると次の項目を保存します。バージョン 1 のタスクファイルも引き続き読み込めます。

windowsExe: true
exeName: MyApp.exe
exeMode: console
exeIcon: assets/app.ico
exeFileVersion: 1.4.2.0
exeProductVersion: 1.4.2.0
exeCompany: Example Inc.
exeProduct: Example Service
exeDescription: Example background service
exeCopyright: Copyright (C) 2026 Example Inc.

9. トラブルシューティング

症状原因と対処
Windows のターゲットプラットフォームが必要、と表示されるEXE を有効にしているのに windows-x64windows-x86windows-aarch64 のいずれも選んでいません。
バージョン番号の形式が正しくない、と表示されるバージョン項目に文字や空白が含まれている、5 個以上に分かれている、またはいずれかの値が 0〜65535 の範囲外です。
EXE 名はファイル名のみ、と表示される名前にパス区切り文字が含まれています。ディレクトリを含まない名前にしてください。
アイコンファイルが見つからない、と表示される--exe-icon が存在しない .ico を指しています。パスを確認してください。
ダブルクリックしてもウィンドウが出ず、すぐ終了するGUI モードでアプリケーションの起動に失敗しています。コンソールモードでパッケージングし直し、エラー出力を確認してください。
別の場所にコピーした EXE が動かないランチャーはランタイムとアーカイブが同じパッケージディレクトリにあることを前提とします。出力ディレクトリ全体をコピーしてください。

全オプションの一覧は CLI リファレンスを、GUI のウィザードについては GUI ガイドを参照してください。