JVM 启动选项配置

Protector4J 支持在打包时设置 JVM 启动选项,也支持在部署后临时追加,或直接修改生成的启动脚本。GUI 中其它高级选项的说明见 Protector4J 高级模式设置

1. 四种配置方式

方式生效范围重新打包后是否保留适用场景
GUI 的 JVM 启动选项写入本次生成的全部平台启动脚本是,只要还留着任务参数就能重新生成日常交互式打包
命令行的 --jvm-option写入本次生成的全部平台启动脚本是,命令或任务文件即配置来源CI/CD、可重复构建
修改 run.shrun.bat 或 Tomcat 脚本只影响你改动的那个部署目录否,重新打包会覆盖部署后的紧急调整或环境专属调整
APP_JAVA_OPTS 环境变量只影响当前进程或当前环境不写入任何文件临时诊断,以及从容器或服务环境注入

建议把长期使用的选项放在 GUI 任务或 CLI 命令中,把 APP_JAVA_OPTS 用作临时覆盖。如果直接改了生成的脚本,请把改动记入部署文档 —— 下次重新打包时需要再改一遍。

2. 在 GUI 中配置

  1. 在输入页选择高级——自行定制选项;从简单模式进入时,在最终页点击**自定义…**即可打开高级选项。
  2. 通用选项中找到 JVM 启动选项
  3. 每行填写一个完整的选项,例如:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
  1. 在最终参数摘要中核对,然后执行保护。

这些选项会写入生成的 run.shrun.bat;macOS 的 run.command 调用的是同一份 run.sh,因此使用相同的选项。对 Tomcat,它们还会写入 bin/catalina.shbin/catalina.bat 的启动路径。类库加密只生成归档、不生成启动脚本,因此该输入框不可用。

GUI 中的 JVM 启动选项

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.batbin\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.shrun.bat 命令之后。
  • 调整堆大小之后,要结合容器内存限制、宿主机可用内存和真实负载一起验证。
  • 重新打包会覆盖启动脚本,手工改动不会被自动合并回来。