JVM スタートアップオプション
Protector4J では、パッケージング時に JVM スタートアップオプションを設定できるほか、配備後に一時的に追加したり、生成された起動スクリプトを直接編集したりできます。GUI のその他の詳細オプションについては Protector4J 詳細設定モードを参照してください。
1. 設定方法は 4 つ
| 方法 | 影響範囲 | 再パッケージング後も残るか | 向いている場面 |
|---|---|---|---|
| GUI の JVM スタートアップオプション | その回に生成される全プラットフォームの起動スクリプト | 残ります。タスクの設定が手元にあれば再生成できます | 日常的な対話操作でのパッケージング |
コマンドラインの --jvm-option | その回に生成される全プラットフォームの起動スクリプト | 残ります。コマンドやタスクファイルが設定の出どころになります | CI/CD、再現性のあるビルド |
run.sh、run.bat、Tomcat のスクリプトを編集 | 編集した配備ディレクトリのみ | 残りません。再パッケージングで上書きされます | 配備後の緊急対応や環境固有の調整 |
APP_JAVA_OPTS 環境変数 | 現在のプロセスまたは環境のみ | ファイルには何も書き込まれません | 一時的な調査、コンテナーやサービス環境からの注入 |
長く使うオプションは GUI のタスクか CLI のコマンドに置き、APP_JAVA_OPTS は一時的な上書きに使ってください。生成されたスクリプトを直接編集した場合は、その変更を配備手順に記録しておいてください。次回のパッケージング後に、もう一度適用する必要があります。
2. GUI で設定する
- 入力ページで詳細設定 — オプションを自分でカスタマイズしますを選びます。シンプルモードから入った場合は、最終ページの**カスタマイズ...**から詳細オプションを開けます。
- 一般的なオプションの中の JVM スタートアップオプションを見つけます。
- 1 行に 1 つ、完全な形で入力します。例:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
- 最終サマリーで確認してから保護を実行します。
これらのオプションは、生成される run.sh と run.bat に書き込まれます。macOS の run.command は同じ run.sh を呼び出すため、同じオプションが使われます。Tomcat の場合は bin/catalina.sh と bin/catalina.bat の起動経路にも書き込まれます。ライブラリ暗号化はアーカイブのみを生成し起動スクリプトを作らないため、この入力欄は使えません。

3. コマンドラインで設定する
オプションごとに --jvm-option を繰り返します。複数の JVM オプションを 1 つの値にまとめないでください。
p4j javaapp app.jar dist \
--jvm-option -Xms512m \
--jvm-option -Xmx2g \
--jvm-option -Dfile.encoding=UTF-8
Spring Boot:
p4j springboot app.jar dist \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Tomcat:
p4j tomcat app.war dist \
--context /app \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
空白や特殊文字を含むオプションは、全体を引用符で囲みます。
--jvm-option '-Dexample.message=hello world'
パッケージャーは、この区切りに従ってシェルスクリプトとバッチファイルそれぞれにエスケープを行います。
4. macOS と Linux でスクリプトを編集する
通常の Java アプリケーションと Spring Boot アプリケーションでは、出力ディレクトリの run.sh を編集します。run.command は run.sh を呼び出すだけなので、編集は不要です。
生成された JVM_OPTS=(...) と、その後に続く JVM_OPTS+=(...) を見つけ、APP_JAVA_OPTS の判定より前に自分の行を追加します。
JVM_OPTS+=("-Xms512m" "-Xmx2g" "-Dfile.encoding=UTF-8")
if [ -n "${APP_JAVA_OPTS:-}" ]; then
# ...
fi
パッケージャーが Spring Boot や JavaFX のために生成した --add-opens、--module-path、--add-modules は削除しないでください。
Tomcat の場合は bin/catalina.sh を編集し、run_java() 内の JVM_OPTS=(...) の後に自分の行を追加します。
run_java() {
JVM_OPTS=(...)
JVM_OPTS+=("-Xms1g" "-Xmx2g")
# ...
}
この変更は、run.sh によるフォアグラウンド実行にも、bin/startup.sh によるバックグラウンド起動にも適用されます。
5. Windows でスクリプトを編集する
通常の Java アプリケーションと Spring Boot アプリケーションでは、出力ディレクトリの run.bat を編集します。生成された set "JVM_OPTS=..." を見つけ、APP_JAVA_OPTS の判定より前に自分の行を追加します。
set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g -Dfile.encoding=UTF-8"
if defined APP_JAVA_OPTS set "JVM_OPTS=%JVM_OPTS% %APP_JAVA_OPTS%"
JVM_OPTS の既存の内容は残してください。Spring Boot や JavaFX が必要とする内部オプションを削除しないでください。
Windows でフォアグラウンド実行する Tomcat
bin\catalina.bat を編集し、既存の set "JVM_OPTS=..." の後に次を追加します。
set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"
これは run.bat と bin\catalina.bat run の両方に適用されます。
Windows でバックグラウンド起動する Tomcat
bin\startup.bat は PowerShell でバックグラウンドプロセスを作ります。恒久的に変更するもっとも簡単な方法は、catalina.bat を呼び出す前に APP_JAVA_OPTS を設定することです。
@echo off
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
call "%~dp0catalina.bat" start %*
exit /b %ERRORLEVEL%
フォアグラウンドとバックグラウンドをまとめて設定しつつ、2 か所のスクリプトを管理したくない場合は、GUI か CLI で --jvm-option を指定して Tomcat パッケージを作り直すほうが簡単です。
6. APP_JAVA_OPTS でその回だけ適用する
macOS と Linux
APP_JAVA_OPTS="-Xms512m -Xmx2g" ./run.sh
Tomcat:
APP_JAVA_OPTS="-Xms1g -Xmx2g" ./bin/startup.sh
Windows の CMD
現在の CMD セッションに設定します。以降のコマンドが引き継ぎ、set APP_JAVA_OPTS= で解除できます。
set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
run.bat
範囲を限定し、実行後に環境を元に戻す場合:
setlocal
set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
call run.bat
endlocal
Tomcat:
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
bin\startup.bat
Windows の PowerShell
$env:APP_JAVA_OPTS = '-Xms512m -Xmx2g'
.\run.bat
Remove-Item Env:APP_JAVA_OPTS
7. 順序と注意点
- ツールが生成したオプションが先に並び、次に GUI や CLI で設定したオプション、最後に
APP_JAVA_OPTSが追加されます。 - 一部の JVM オプションは後の値が前の値を上書きしますが、すべてのオプションが安全に繰り返せるわけではありません。上書きを目的に重複指定しないでください。
APP_JAVA_OPTSは空白で区切られるため、空白を含む単一のオプションは扱えません。その場合は GUI、--jvm-option、またはスクリプト内の配列の編集を使ってください。- JVM オプションはメインクラスや
-jarより前に置きます。アプリケーション自身の引数はrun.shやrun.batの後に置きます。 - ヒープサイズを変更したら、コンテナーのメモリ上限、ホストの空きメモリ、実際の負荷と合わせて確認してください。
- 再パッケージングすると起動スクリプトは上書きされ、手動の変更は自動的にはマージされません。