JVM 启动选项配置
Protector4J 支持在打包时设置 JVM 启动选项,也支持在部署后临时追加,或直接修改生成的启动脚本。GUI 中其它高级选项的说明见 Protector4J 高级模式设置。
1. 四种配置方式
| 方式 | 生效范围 | 重新打包后是否保留 | 适用场景 |
|---|---|---|---|
| GUI 的 JVM 启动选项 | 写入本次生成的全部平台启动脚本 | 是,只要还留着任务参数就能重新生成 | 日常交互式打包 |
命令行的 --jvm-option | 写入本次生成的全部平台启动脚本 | 是,命令或任务文件即配置来源 | CI/CD、可重复构建 |
修改 run.sh、run.bat 或 Tomcat 脚本 | 只影响你改动的那个部署目录 | 否,重新打包会覆盖 | 部署后的紧急调整或环境专属调整 |
APP_JAVA_OPTS 环境变量 | 只影响当前进程或当前环境 | 不写入任何文件 | 临时诊断,以及从容器或服务环境注入 |
建议把长期使用的选项放在 GUI 任务或 CLI 命令中,把 APP_JAVA_OPTS 用作临时覆盖。如果直接改了生成的脚本,请把改动记入部署文档 —— 下次重新打包时需要再改一遍。
2. 在 GUI 中配置
- 在输入页选择高级——自行定制选项;从简单模式进入时,在最终页点击**自定义…**即可打开高级选项。
- 在通用选项中找到 JVM 启动选项。
- 每行填写一个完整的选项,例如:
-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 选项塞进同一个值里。
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 脚本和批处理脚本做转义。
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命令之后。 - 调整堆大小之后,要结合容器内存限制、宿主机可用内存和真实负载一起验证。
- 重新打包会覆盖启动脚本,手工改动不会被自动合并回来。