Protector4J 高级模式设置

高级模式可以手工设定保护范围、兼容性选项,以及各应用类型专有的选项。第一次处理某个新应用时,建议先用简单模式,或者在高级选项页面先跑一次兼容性扫描,再根据扫描结果调整。

本文是 GUI 使用指南中高级模式一节的展开说明。要判断哪些类应当保持不受保护,参见兼容性与保护范围;要写出等价的自动化命令,参见 CLI 参数参考

1. 进入高级模式

  1. 选择应用类型,并选好输入的 JAR 或 WAR。
  2. 选择随包 Java 版本和至少一个目标平台。
  3. 模式中选择高级——自行定制选项
  4. 点击下一步进入高级选项页面。

如果你已经在输出确认页,点击**自定义…**即可回到高级选项页面。改完之后回到输出页,确认摘要已经反映出新的设置。

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 相关选项
TomcatTomcat 版本、上下文路径、要排除的类未选择版本;上下文路径为 /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 布局,对于用 ZipInputStreamJarInputStream 从内存流解析归档的场景也无能为力。

对应的 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 应用的选项

普通 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 的选项

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 的高级参数

Tomcat 版本

  • WAR 使用 javax.servlet.* 时,选择 Tomcat 9 · javax
  • WAR 使用 jakarta.servlet.* 时,选择 Tomcat 10.1 · jakarta

Tomcat 10.1 至少需要 Java 11。拿不准时先跑一次兼容性扫描。如果应用同时用到了 javaxjakarta,不要强行选定版本,应当先解决依赖冲突。

高级模式不会预选版本,你必须接受扫描建议或手动选择一个才能继续。对应的 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 子目录。

生成之后,必须在每个目标平台上用包内的启动脚本验证启动、框架扫描、序列化、反射、资源加载和核心业务路径。高级选项配置正确,只能说明任务参数设对了,不能替代对最终产物的验证。