Protector4J 高级模式设置
高级模式可以手工设定保护范围、兼容性选项,以及各应用类型专有的选项。第一次处理某个新应用时,建议先用简单模式,或者在高级选项页面先跑一次兼容性扫描,再根据扫描结果调整。
本文是 GUI 使用指南中高级模式一节的展开说明。要判断哪些类应当保持不受保护,参见兼容性与保护范围;要写出等价的自动化命令,参见 CLI 参数参考。
1. 进入高级模式
- 选择应用类型,并选好输入的 JAR 或 WAR。
- 选择随包 Java 版本和至少一个目标平台。
- 在模式中选择高级——自行定制选项。
- 点击下一步进入高级选项页面。
如果你已经在输出确认页,点击**自定义…**即可回到高级选项页面。改完之后回到输出页,确认摘要已经反映出新的设置。
Java 版本和目标平台无法在高级选项页面修改,需要调整请返回输入页。多平台任务会为每个平台生成独立的输出,它们的 vlxjre 不能互换。
2. 通用选项
四种应用类型共用这一区域,但部分设置只对特定类型生效。类库加密不生成启动脚本,因此没有 JVM 启动选项;它的归档后缀设置用于建议并同步输出文件名。
| 设置 | 默认值 | 作用 | 建议 |
|---|---|---|---|
| 归档后缀 | p4jx | 把应用归档命名为 .p4jx 或 .jar | 保持 .p4jx。只有当第三方组件硬编码了 .jar 文件名时才改为 jar。 |
| 对受保护方法禁用 JIT | 关闭 | 让受保护方法只在解释器中执行 | 代码高度敏感、且已经评估过性能代价时再开启。 |
| 追加扫描器 ZIP 覆盖层 | 关闭 | 为扫描 ZIP 结构的工具提供一个兼容视图 | 只在兼容性扫描建议开启,或应用确实会读取物理 ZIP 结构时才开启。 |
| JVM 启动选项 | 空 | 把 JVM 选项写入生成的启动脚本 | 每行填写一个完整的选项。 |
| 兼容性扫描… | 不自动执行 | 扫描输入并给出保守建议 | 新应用、框架升级之后,以及调整保护范围之后,都重新跑一次。 |
各应用类型专有的选项如下:
| 应用类型 | 专有选项 | 初始状态 | 对应的 CLI 选项 |
|---|---|---|---|
| Java 应用 | 主类、要排除的类、JavaFX 与 WebView | 主类取自清单;不排除任何类;不打包 JavaFX | --main、--exclude、--javafx、--javafx-webview / --no-javafx-webview |
| Spring Boot | 主类、布局、保护依赖 JAR、要排除的类、JavaFX 与 WebView | 主类取自 Start-Class;布局为 p4jx-fat;不保护依赖;不排除任何类;不打包 JavaFX | --main、--layout、--protect-lib、--exclude,以及 JavaFX 相关选项 |
| Tomcat | Tomcat 版本、上下文路径、要排除的类 | 未选择版本;上下文路径为 /app;不排除任何类 | --tomcat-version、--context、--exclude |
「不排除任何类」是指默认保护该应用类型的全部应用类,并不表示第三方依赖也一并保护 —— Spring Boot 的 BOOT-INF/lib 和 Tomcat 的 WEB-INF/lib 默认都不在保护范围内。
归档后缀
选择 jar 只改变文件名,内容仍然是 P4JX:既不能用普通的 ZIP 或 JAR 工具打开,也无法由标准 JRE 加载。对类库加密而言,该设置会在 .p4jx 和 .jar 之间切换输出文件的后缀;如果你自行填写了其它后缀,则保留你写的完整文件名。
对应的 CLI 选项:
--archive-suffix p4jx
--archive-suffix jar
对受保护方法禁用 JIT
开启对受保护方法禁用 JIT后,受保护方法不会进入 JIT 编译器,从而减少编译后机器码的暴露面。这可能让计算密集的代码明显变慢。该设置只影响受保护方法,不会让整个 JVM 进入纯解释执行模式。
对应的 CLI 选项:
--no-jit
扫描器 ZIP 覆盖层
覆盖层只暴露公开资源、目录和受保护类的元数据桩,绝不包含真实的方法体。它的作用是让直接读取 ZIP 中央目录的工具仍然可用。它不能替代 Spring Boot 的 fat 布局,对于用 ZipInputStream 或 JarInputStream 从内存流解析归档的场景也无能为力。
对应的 CLI 选项:
--zip-overlay scanner
JVM 启动选项
每行填写一个完整的选项,例如:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
每一行就是一个选项,绝不要把两个选项写在同一行。这些选项会写入 macOS、Linux 和 Windows 的启动脚本;对 Tomcat,还会写入它的启动路径。类库加密不生成启动脚本,因此该输入框不可用。更完整的各平台示例见 JVM 启动选项配置。
对应的 CLI 写法是重复该选项:
--jvm-option -Xms512m --jvm-option -Xmx2g
3. 兼容性扫描与扫描建议
四种应用类型都可以点击**兼容性扫描…**来扫描当前输入。接受扫描结果后,工具会把该应用类型对应的建议合并进当前设置,主要包括:
- 追加应当保持不受保护的类;
- 启用扫描器 ZIP 覆盖层;
- 调整归档后缀;
- 为 Java 应用或 Spring Boot 启用 JavaFX 与 WebView;
- 为 Spring Boot 选择布局;
- 为 Tomcat 选择 9 或 10.1。
类库加密只会自动应用扫描器 ZIP 覆盖层和归档后缀这两项建议。它的设计目标就是保护输入 JAR 中的全部类,不支持排除;因此扫描如果发现必须保持不受保护的内容(例如 JNI 或原生类),报告会明确建议你把这些类移到普通 JAR 中,或者改用支持选择性保护的打包模式。
接受建议之后仍然可以继续编辑。扫描会保留你已有的排除规则,也不会因为没检测到 JavaFX 就把你手动开启的 JavaFX 关掉。取消对话框则不应用任何建议。
报告中属于代码层面的风险 —— Agent、JNI、自定义类加载器、运行时修改字节码 —— 通常不是改个开关就能解决的。请参照兼容性与保护范围调整代码边界,然后实际测试。
4. Java 应用的选项

主类
留空时,从输入 JAR 的清单中读取 Main-Class。只有当清单里没有主类,或者需要覆盖它时,才填写完整类名,例如 com.example.Main。
对应的 CLI 选项:--main com.example.Main。
要排除的类
默认保护全部应用类。列在这里的类和包保持不受保护,适用于 DTO、实体、配置类、JNI 桥接类,以及任何会被框架增强、或需要读取自身真实字节码的类。规则写法见下文「保护范围与排除规则」。
JavaFX 运行时
普通 JavaFX 应用请勾选将 JavaFX 内置到打包运行时。WebView 有三种策略可选:
- 自动(检测 javafx.scene.web):检测到
javafx.scene.web时才包含; - 包含:始终包含
fx-webkit; - 排除:始终不包含。
WebView 大约会增加 40 MB。GUI 会为你的目标 Java 版本和平台下载相应组件;如果需要指定本地离线的 JavaFX 目录,请使用 CLI。
对应的 CLI 选项:--javafx、--javafx-webview、--no-javafx-webview。自动没有额外选项,因为它由打包器根据应用自身的引用来判断。
5. Spring Boot 的选项

主类
留空时,从清单中读取 Start-Class。需要覆盖时,填写完整类名。
对应的 CLI 选项:--main com.example.Application。
布局
| 布局 | 适用场景 |
|---|---|
p4jx-fat | 默认布局。标准的 Spring Boot 服务,保护范围最广。 |
fat | 应用需要物理的 Spring Boot JAR 结构,例如使用 ClassGraph 或 Reflections。 |
separate | 要求 lib/* 扁平类路径的老旧集成环境。 |
如果兼容性扫描明确建议使用 fat,就不要强行改回 p4jx-fat 再指望靠 ZIP 覆盖层顶上。各布局的详细说明见保护 Spring Boot 应用。
对应的 CLI 选项:--layout p4jx-fat、--layout fat、--layout separate。
保护依赖 JAR…
BOOT-INF/lib 中的依赖默认不受保护。只勾选你自有的闭源依赖,不要加密 Spring、Tomcat、日志库、数据库驱动这类第三方框架包。已签名的 JAR 无法勾选,因为修改它们会破坏签名。
勾选某个依赖后,其中的全部类都会受保护,但你仍然可以用要排除的类把其中特定的类或包排除出去。三种 Spring Boot 布局都支持保护依赖。
对应的 CLI 选项:--protect-lib 'company-core.jar,company-domain.jar'。CLI 还支持 glob 通配写法;GUI 记录的则是你所勾选 JAR 的精确文件名。
要排除的类与 JavaFX
用法与 Java 应用完全相同。排除规则同时作用于应用类和你选择保护的依赖 JAR。Spring Boot 桌面应用也可以在 JavaFX 运行时页签中打包 JavaFX 与 WebView。
6. Tomcat 的选项

Tomcat 版本
- WAR 使用
javax.servlet.*时,选择 Tomcat 9 · javax; - WAR 使用
jakarta.servlet.*时,选择 Tomcat 10.1 · jakarta。
Tomcat 10.1 至少需要 Java 11。拿不准时先跑一次兼容性扫描。如果应用同时用到了 javax 和 jakarta,不要强行选定版本,应当先解决依赖冲突。
高级模式不会预选版本,你必须接受扫描建议或手动选择一个才能继续。对应的 CLI 选项为 --tomcat-version 9 或 --tomcat-version 10,CLI 还接受 auto。
上下文路径
填写以 / 开头的部署路径,例如 /app。留空时使用 /app。向已有的 Tomcat 输出目录追加应用时,上下文路径不能与已有应用冲突。
对应的 CLI 选项:--context /app。
要排除的类
默认保护 WEB-INF/classes 下的应用类,WEB-INF/lib 不在保护范围内。Servlet、Filter、Listener、DTO、配置类、实体、JNI 桥接类,以及需要由容器增强的类,通常都应当排除。
7. 保护范围与排除规则
高级模式下,GUI 默认保护全部应用类,你通过要排除的类来划定框架边界。支持三种规则写法:
com.example.SecretService 只匹配这一个类
com.example.service.* 只匹配当前包,不含子包
com.example.service.** 匹配当前包及其所有子包
可以用**选择…从类树中挑选,也可以用添加…**手工输入。选中一个包时,默认覆盖该包及其子包;用 .* 可以限定为只包含该包本身。Spring Boot 的类树还会显示你选择保护的依赖 JAR。
推荐的组织方式是:公开边界或框架入口 → 普通 facade 或接口 → 受保护的核心实现。不要为了让保护面看起来更大,就把所有第三方依赖和框架入口一并加密。
8. 导出、复用与最终复核
点击导出参数…可以导出一个 p4j-task.yml 任务文件,该文件可以手工编辑。它记录当前已解析的选项,但绝不会写入账号邮箱和密码。之后可以通过窗口顶部的加载任务文件恢复任务;该入口同时仍能读取旧版本导出的 p4j-encrypt-run.sh 和 .bat 脚本。
进入输出页后,至少要复核以下内容:
- 输入文件、应用类型、Java 版本和全部目标平台;
- 归档后缀、JIT 设置、扫描器覆盖层和 JVM 启动选项;
- JavaFX 与 WebView、Spring Boot 布局,或 Tomcat 版本与上下文路径;
- 已选择保护的依赖 JAR 和全部排除规则;
- 输出目录,以及是否新建
p4jx-xxxx子目录。
生成之后,必须在每个目标平台上用包内的启动脚本验证启动、框架扫描、序列化、反射、资源加载和核心业务路径。高级选项配置正确,只能说明任务参数设对了,不能替代对最终产物的验证。