JVM 啟動引數配置
Protector4J 支援在打包時配置 JVM 啟動引數,也支援在部署後臨時追加或直接修改生成的啟動指令碼。GUI 中其他高階引數見 Protector4J 高階模式設定。
1. 三種配置方式
| 方式 | 生效範圍 | 是否隨重新打包保留 | 推薦用途 |
|---|---|---|---|
| GUI 的 JVM startup options | 寫入本次生成的全部平臺啟動指令碼 | 是,任務引數仍在時可重複生成 | 日常互動式打包 |
CLI 的 --jvm-option | 寫入本次生成的全部平臺啟動指令碼 | 是,命令/任務指令碼可作為配置源 | CI/CD、可重複釋出 |
修改 run.sh、run.bat 或 Tomcat 指令碼 | 只修改當前部署目錄 | 否,重新打包會覆蓋 | 部署後的緊急或環境專屬調整 |
APP_JAVA_OPTS 環境變數 | 隻影響當前程序或當前環境 | 不寫入檔案 | 臨時診斷、容器/服務環境注入 |
推薦把長期引數放在 GUI 任務或 CLI 命令中,把 APP_JAVA_OPTS 用作臨時覆蓋。直接修改生成指令碼後,應把改動記錄到部署配置;下次重新打包需要重新應用。
2. 在 GUI 中配置
- 在輸入頁選擇 Advanced — customise the options yourself;簡單模式可在最終頁點選 Customize… 進入高階引數。
- 在 Common options 中找到 JVM startup options。
- 每行輸入一個完整引數,例如:
-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 的啟動路徑。Library Encryption 只生成歸檔、不生成啟動指令碼,因此不提供此配置。

3. 在 CLI 中配置
每個引數使用一次 --jvm-option,不要把多個 JVM 引數合併成一個值:
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'
編碼器會按引數邊界為 shell 和 batch 指令碼分別轉義。
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%
如需同時支援前臺和後臺且不維護兩處指令碼,優先通過 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命令之後。 - 修改堆大小後應結合容器記憶體限制、作業系統可用記憶體和實際負載進行驗證。
- 重新打包會重寫啟動指令碼,手工改動不會自動合併。