Windows EXE ランチャーの生成
パッケージング時に、保護されたアプリケーション用のネイティブ Windows ランチャーを生成できます。純粋な Win32 実行ファイルで、ダブルクリックするだけで動くため、利用者が事前に Java をインストールする必要も、run.bat を意識する必要もありません。
EXE は任意で、既定では生成されません。有効にした場合も、パッケージには run.sh、run.command、run.bat がそのまま残ります。どちらの起動方法でも、アーカイブ構成、クラスパス、メインクラス、JVM スタートアップオプションはまったく同じです。
1. 適用範囲
| アプリケーションの種類 | Java アプリケーション、Spring Boot (3 つのレイアウトすべて)、Tomcat |
| ターゲットプラットフォーム | windows-x64、windows-x86、windows-aarch64 |
| 非対応 | ライブラリ暗号化 — 単一の .p4jx アーカイブは実行可能なアプリケーションディレクトリではありません |
Windows のターゲットプラットフォームを 1 つ以上選ぶ必要があります。Linux や macOS のターゲットを同時に選んでも問題ありません。それらのパッケージは EXE なしで通常どおり生成され、従来のスクリプトから起動します。Windows のターゲットを 1 つも選んでいない場合は、タスクがすぐに失敗します。
2. GUI での操作
- 入力ファイルとターゲットプラットフォームのページで Windows アプリケーション EXE を生成 (x64/x86/ARM64) にチェックを入れ、Windows のターゲットプラットフォームを 1 つ以上選びます。
- このチェックボックスはシンプルモードと詳細設定モードの分岐より前にあるため、どちらのモードでも EXE を生成できます。
- チェックを入れると Windows EXE ランチャーページが追加され、ファイル名、ランチャーモード、アイコン、Windows バージョン情報を入力できます。チェックしない場合は、そのまま最終確認ページに進みます。
- EXE を有効にすると、JVM スタートアップオプションの入力欄はこのランチャーページにのみ表示されます。同じオプションの入力欄が 2 か所に現れないようにするためです。入力した内容は EXE と起動スクリプトの両方に書き込まれます。
- 最終確認ページには、実際に 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-exe | Windows アプリケーション 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.0 や 1.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_OPTIONS、JDK_JAVA_OPTIONS、CLASSPATH をクリアし、外部から起動オプションを注入されないようにします。 |
EXE の JVM オプションはパッケージング時に固定され、パラメーターブロックとともに署名されて実行時に検証されるため、配備後に変更することはできません。APP_JAVA_OPTS が影響するのは run.bat だけで、EXE はこれを読みません。EXE の JVM オプションを変更するには、パッケージングをやり直してください。
同じ理由から、-javaagent、-agentlib、-agentpath、-Xbootclasspath、--patch-module は EXE の起動オプションに書き込めません。これらを --jvm-option で渡すと、パッケージングはその場で失敗します。
7. コード署名
Protector4J は生成した EXE に発行元の署名を付けず、Authenticode の資格情報にも一切触れません。アイコン、バージョンリソース、起動オプションといった PE の変更はすべてパッケージング時に完了するため、署名は最後の工程になります。
- パッケージングを完了し、EXE からアプリケーションが正しく起動することを確認します。
- 自分の証明書で Authenticode 署名を行い、RFC3161 のタイムスタンプを付与します。
- 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-x64、windows-x86、windows-aarch64 のいずれも選んでいません。 |
| バージョン番号の形式が正しくない、と表示される | バージョン項目に文字や空白が含まれている、5 個以上に分かれている、またはいずれかの値が 0〜65535 の範囲外です。 |
| EXE 名はファイル名のみ、と表示される | 名前にパス区切り文字が含まれています。ディレクトリを含まない名前にしてください。 |
| アイコンファイルが見つからない、と表示される | --exe-icon が存在しない .ico を指しています。パスを確認してください。 |
| ダブルクリックしてもウィンドウが出ず、すぐ終了する | GUI モードでアプリケーションの起動に失敗しています。コンソールモードでパッケージングし直し、エラー出力を確認してください。 |
| 別の場所にコピーした EXE が動かない | ランチャーはランタイムとアーカイブが同じパッケージディレクトリにあることを前提とします。出力ディレクトリ全体をコピーしてください。 |
全オプションの一覧は CLI リファレンスを、GUI のウィザードについては GUI ガイドを参照してください。