保护普通 Java 应用

javaapp 用于处理带主类的普通 Java 应用。它会生成受保护归档、各目标平台的 VLX JRE,以及启动脚本。

1. GUI 操作

  1. 在应用类型页面选择 Java 应用

    选择 Java 应用

  2. 选择输入 JAR、随包 Java 版本和目标平台,然后选择简单模式或高级模式。

    选择输入、Java 版本、目标平台和模式

  3. 使用高级模式时,按需填写主类,并配置 JVM 启动选项、JavaFX 设置和排除规则;简单模式会跳过这一页。各选项的含义参见 Protector4J 高级模式设置

    配置普通 Java 应用的高级参数

  4. 选择输出目录,核对参数摘要,然后点击运行保护

    选择输出目录并执行保护

2. CLI 示例

清单中已经声明了正确的 Main-Class 时:

p4j javaapp app.jar dist

清单中没有 Main-Class,或者需要改用其它启动类时,用 --main 指定:

p4j javaapp app.jar dist --main com.example.Main

同时指定主类和 JVM 启动选项:

p4j javaapp app.jar dist \
  --main com.example.Main \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g

只保护应用的一部分:

p4j javaapp app.jar dist \
  --protect 'com.example.core.**' \
  --exclude 'com.example.core.dto.**'

兼容性扫描,以及自动应用扫描建议:

p4j javaapp app.jar --compat-scan
p4j javaapp app.jar dist --compat-apply

这两个选项不能同时使用,它们的区别是:

选项作用何时使用
--compat-scan只扫描输入 JAR,打印风险和配置建议后退出;不做编码,也不生成 dist,因此不需要输出目录。首次保护应用、升级依赖或调整保护范围之后,以及排查兼容性问题时,先用它查看报告。
--compat-apply扫描后合并保守建议,然后继续编码并写出结果,因此必须指定输出目录。已经看过扫描结果并接受这些建议时,用它完成打包;规则验证过之后的重复构建和 CI 流程也适用。

javaapp 来说,--compat-apply 可以根据扫描结果追加排除规则,并调整扫描器 ZIP 覆盖层、JavaFX 和归档后缀这三类选项。对这三类选项,命令行中显式指定的值优先。建议排除的类默认会与你显式写的 --exclude 合并;如果不希望自动追加,同时传入 --no-compat-excludes 即可。扫描器只做静态启发式分析,需要修改代码才能解决的问题不会被 --compat-apply 自动修复,打包完成后仍然要在目标平台上做回归测试。

其它 CLI 命令、全部选项、环境变量和自动化示例,请参阅 CLI 参数参考

3. 输出结构

dist/
├── app.p4jx              # 使用 --archive-suffix jar 时生成 app.jar
├── vlxjre/               # 与归档和目标平台匹配的运行时
├── lib/                  # 清单 Class-Path 中的依赖,可选
├── run.sh
├── run.command
├── run.bat
└── README.md

非 class 资源保存在 P4JX 归档的公开资源视图中。受保护的类只向扫描器呈现元数据桩,真实的方法体只能由 VLX 运行时加载。

4. 启动

./run.sh [应用参数...]

Windows:

run.bat [应用参数...]

不要用系统 JRE 替换输出目录中的 vlxjre。如果必须手工启动,请以生成的脚本为模板,保留其中的类路径、VM 参数和 JavaFX 模块参数。

打包 Windows 目标时,还可以额外生成一个双击即可运行的原生启动程序,它与启动脚本并存,详见生成 Windows EXE 启动器

JVM 启动选项

打包时可以在 GUI 的 JVM 启动选项中每行填写一个选项,也可以在命令行中重复使用该选项:

--jvm-option -Xms512m --jvm-option -Xmx2g

要在已部署的目录中永久修改:

  • macOS 与 Linux:编辑 run.sh,在 APP_JAVA_OPTS 判断之前加上 JVM_OPTS+=("-Xms512m" "-Xmx2g")run.command 调用的是同一份 run.sh
  • Windows:编辑 run.bat,在 APP_JAVA_OPTS 判断之前加上 set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g"

临时选项可以通过 APP_JAVA_OPTS 注入。完整示例和注意事项见 JVM 启动选项配置。手工改动的脚本会在重新打包时被覆盖。

5. 保护范围建议

默认保护应用自身的类。对生产项目,更推荐显式限定自有业务包:

--protect 'com.mycompany.product.**'

通常应该排除的类:

  • 由 Jackson 直接序列化或反序列化的 DTO 和 record;
  • 字段或方法被 JNI 访问的类;
  • 需要被 ORM、依赖注入容器或代理框架改写的类;
  • 第三方库与开源框架;
  • 必须由自定义 ClassLoader 从字节数组重新定义的类。

6. .p4jx.jar 后缀

p4j javaapp app.jar dist --archive-suffix jar

这个选项只改变文件名,归档内容仍然是 P4JX。只有当第三方组件在 URL 或文件名中硬编码了 .jar 时才需要使用它;它不会把归档变成普通的 ZIP 或 JAR。