保护普通 Java 应用
javaapp 用于处理带主类的普通 Java 应用。它会生成受保护归档、各目标平台的 VLX JRE,以及启动脚本。
1. GUI 操作
-
在应用类型页面选择 Java 应用。

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

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

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

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。