更新日志
6.0.19 2026-08-15
未登录账号加密时明确提示试用版有效期
- 未提供账号凭据时,CLI 的警告现在会明确说明:生成的受保护应用使用试用许可,仅能运行 7 天,并附上购买许可的地址 https://protector4j.com。此前的警告只提到「试用许可」,没有说明这对应用意味着什么。
- GUI 在开始加密前会以对话框展示同样的提示,提供三个选择:购买、继续任务、取消任务。购买按钮打开的是当前所选服务器区域对应的购买页面,选择 .cn 区域的用户不会被带到 .com 站点。
支持从其它工具带参数启动 GUI
- GUI 现在接受启动参数:
p4j-ui [--task-file <file>] [<input-file>]。传入任务文件会走正常的导入流程,直达最终确认页。传入普通输入路径则预填进新任务:.war自动进入 Tomcat 流程,.jar停在应用类型选择页,因为一个 JAR 可能是 Java 应用、Spring Boot 应用或类库。这是为 IDE 插件等外部工具准备的对接入口;未知的横线参数会被忽略,不带参数启动 GUI 的行为与之前完全一致。
独立类库加密标记为开发中
- 独立类库加密在 6.x 线尚未就绪,现在明确标记出来:GUI 中对应的选择卡片置灰并带「开发中」角标,CLI 的
encode命令会输出说明信息后退出,不再开始任务。该功能会在后续版本中提供。
6.0.18 2026-08-13
Spring Boot p4jx-fat 布局支持多版本 JAR
- 修复了 Spring Boot
p4jx-fat布局下多版本依赖只会加载到基础版本的问题。类加载器解包嵌套的BOOT-INF/lib依赖时,是按字面路径存放条目的,于是META-INF/versions/下的类永远选不中,始终回落到基础版本。一个具体表现是:配合 Spring Framework 7.0.5 时,VirtualThreadDelegate解析到的是基础版本的桩实现,而它无条件抛出UnsupportedOperationException,因此在 JDK 25 上开启spring.threads.virtual.enabled=true的应用会启动失败。大量常用依赖都以多版本 JAR 形式发布,其它版本相关的代码路径同样受影响。 - 现在类加载器会在加载时解析多版本条目,按运行中的 JDK 挑出适用的最高版本;打包器构建 fat 资源索引时套用同一套规则,保证索引与加载器对「哪一份生效」的判断始终一致。另外两种布局
fat与separate从未受影响,它们把依赖保留为普通 JAR 文件,由 JVM 自己打开。
6.0.17 2026-08-13
修复 Windows 上路径含非 ASCII 字符时加密应用无法启动
- 修复了在 Windows 上应用路径含有中文等非 ASCII 字符时,加密后的应用无法启动的问题。视路径在哪里被读错,启动会报归档错误
E816,或者表现为解密失败的ClassFormatError。运行时打开归档和归一化路径都是按字节处理的,于是传统代码页里第二个字节恰好是0x5C(反斜杠)的字符会被从中间劈开,后半个字节被当成了目录分隔符。GBK 里有大量常用汉字正好是这种编码。全部由 ASCII 字符组成的路径从未受影响。 - Windows 上运行时现在会先按系统 ANSI 代码页把路径转成宽字符,再打开文件和计算运行时指纹——原厂 JDK 一直就是这么打开文件的。只改动了 Windows 分支,Linux 与 macOS 的行为与之前完全一致。五条 JDK 线都已带此修复重新构建:JDK 25、21、17 升到 VLX 1.0.22,JDK 11 升到 VLX 1.0.20,JDK 8 升到 VLX 1.0.13。
6.0.16 2026-08-10
修复 Windows 上打包 Linux 与 macOS 目标失败
- 修复在 Windows 上、目标平台为 Linux 或 macOS 时打包失败的问题。解压随包运行时会报
Failed to extract P4JX runtime,而实际上运行时已经正确解压完成。Windows 上创建符号链接需要提升权限,而 Linux 与 macOS 的运行时在legal/下有一百多个符号链接——那些是 jlink 为了不重复存放而指向java.base的许可证文本。Windows 自带的tar命令把建不了链接当作警告处理,但仍然返回非零退出码,编码器据此判定为彻底失败,并把已经解压好的运行时删掉了。在 Windows 上打包 Windows 目标从未受影响,因为 Windows 运行时里根本没有符号链接。 - 归档处理不再依赖各平台的
tar命令。编码器现在自己读取和解压.tar.gz运行时与 JavaFX 素材,因此在 Windows、Linux、macOS 上行为完全一致。文件权限(包括启动器的可执行位)取自归档本身,而不是宿主文件系统。Windows 上会跳过那些许可证符号链接:它们对运行时没有任何功能作用,也不参与运行时指纹,因此在 Windows 上加密的应用解密行为与以往完全相同。
6.0.15 2026-08-08
更新对话框修复
- 「有新版本」对话框现在以固定的合理尺寸打开,changelog 较长时不再撑满整个屏幕。
- 工具栏新增「检查更新」入口,随时都能检查新版本,不再只在启动时检查。
6.0.14 2026-08-07
字符串常量内联加密,现为默认
- 新增内联字符串保护模式:把加载字符串的
ldc指令改写成对本类合成解密方法的调用,字符串常量的明文被彻底从常量池移除。明文在类加载时不再进入SymbolTable,只有真正执行到那行代码时才出现在堆上,未用到的字符串始终保持密文。密文随类体一同携带,并受既有的逐方法加密保护——这是纯编码器侧的字节码变换:归档格式与运行时都不变,在所有受支持的 JDK 线上都无需更新运行时即可生效。 - 字符串保护现整合为一个选项、三种模式——无、普通加密(常量池 V72)、内联,且内联是所有应用类型(含 Tomcat)的默认值。已在普通 servlet、字符串
switch业务逻辑、以及 JspC 预编译的 JSP servlet 类上端到端验证。命令行开关为--encrypt-strings none|constant|inline,GUI 提供相同选项。 - 无法改写的方法——旧类文件格式的接口、逼近 64 KB 上限的方法、或罕见的序列化边界情形——会回退到普通的 V72 层,因此结果绝不弱于以往。
Spring Boot p4jx-fat 启动更快
- 纯 fat 布局的 Spring Boot 类加载器现在按需读取其嵌套资源索引,而非预先全部加载,减少大型 p4jx-fat 应用的启动开销。
从环境变量读取账号凭据
encode、javaapp、springboot、tomcat命令及任务文件模式现在可以从P4JX_ACCOUNT_EMAIL和P4JX_ACCOUNT_PASSWORD(或P4JX_ACCOUNT_PASSWORD_MD5)读取账号邮箱与密码,仅在对应命令行选项缺席时使用,因此导出的任务文件不含凭据。
6.0.13 2026-08-05
修复使用 javax.lang.model 的受保护应用启动失败
- 修复受保护应用启动时抛出
NoClassDefFoundError: javax/lang/model/SourceVersion的问题——这类应用的框架会引用javax.lang.modelAPI,最典型的是 Spring Data JPA,它的仓库 AOT processor 在容器初始化时会用到SourceVersion。此前从裁剪运行时中移除的java.compiler模块现已重新纳入。它是纯 API 模块,不含编译器实现,因此ToolProvider.getSystemJavaCompiler()仍返回null、jdk.compiler仍然缺席——防护面没有任何变化。 - JDK 17、21、25 的运行时重建为 VLX 1.0.21,JDK 11 重建为 VLX 1.0.19,都带上了恢复的
java.compiler模块。JDK 8 不受影响,因为它没有模块系统、本就自带这些类。
6.0.12 2026-08-02
支持 JxBrowser 9,并修复受保护应用抛出 NullPointerException 时的崩溃
- 受保护应用现在可以内嵌 JxBrowser 9。
--native-compat jxbrowser从内置目录的九个版本(9.0.0 至 9.3.1)中选择一个,覆盖 Java 17、21、25 上的七个平台。运行时只会把线程 attach 权限授予所选版本已登记 SHA-256 的官方 IPC 库,并在线程真正 attach 时重新核对调用模块;命令行不接受路径、哈希或库名。在 macOS 26 上请使用 JxBrowser 9.0.1 或更高版本:TeamDev 在该版本修复了创建 Engine 时的 Chromium 崩溃,9.0.0 在普通 JDK 上同样会崩溃。 - 修复受保护应用抛出
NullPointerException时出现ClassFormatError的问题。6.0.9 的修复按方法逐个屏蔽 JVM 的扩展 NPE 消息,事实证明并不彻底:该功能会按标准字节码文法解析方法体,而 P4JX 变换过字节码之后,没有任何按方法设置的标志能证明这次解析仍然有效。运行时现在无条件禁用扩展消息。异常类型、调用栈以及应用自己提供的消息都不受影响。JDK 17、21、25 的运行时重建为 VLX 1.0.20;JDK 11 不受此问题影响,保持 VLX 1.0.18,JDK 8 保持 VLX 1.0.12。 java -version现在会显示 VLX 运行时版本,不必解包就能识别交付包里的运行时。- Windows EXE 的两个版本字段改为在打包开始前校验,不再跑到中途才失败。Windows 把每一段版本号存成无符号 16 位整数,因此以点分隔的一到四个数字每个都必须在 0 到 65535 之间;字段留空仍然表示 0.0.0.0。
6.0.11 2026-07-27
受保护应用的原生 Windows 启动器
- Java App 打包、三种 Spring Boot 布局和 Tomcat 打包现在都可以选择生成原生 Windows EXE。Windows x64、x86 和 ARM64 均提供控制台与 GUI 启动器,原有启动脚本也会继续保留在每个交付包中。
- CLI 和 GUI 新增 EXE 文件名、模式、图标及 Windows 版本元数据设置。多平台任务只会为选中的 Windows 目标生成 EXE;设置会保存在版本 2 的
p4j-task.yml中,版本 1 的任务文件仍可读取。 - 纯 Win32 的 JExeKit 启动器已与交付包内的
vlxjre、精确 classpath 和 JVM 参数集成。启动 Java 前,启动器会拒绝逸出交付包范围的路径、通过重解析点进行的替换,以及不安全的 agent 或 boot classpath 选项。 - JExeKit 模板只会以 AES-GCM 加密的
.jxt资源嵌入,生成启动器时仅在内存中解密。每个生成的启动器都会为参数块添加 production 状态的 Ed25519 签名;图标、版本、manifest 和参数修改会在用户最后应用Authenticode签名前全部完成。
6.0.10 2026-07-27
更快且保持原始结构的 Tomcat 依赖加载
- 修复 Tomcat 启动严重变慢的问题:此前每加载一个类,都会重新读取受保护的整个
WEB-INF/lib嵌套 JAR 并计算 Hash。VLX 1.0.17 现在对每个已密封的嵌套 JAR 只验证一次,在 VM 内缓存其已认证来源,并继续根据加密类索引逐一校验每个请求的类。 - 移除临时的
web-libs解包和挂载变通方案。WEB-INF/lib/*.jar继续保留在受保护的.p4jx归档内,维持原始 WAR 结构和应用隔离。JDK 11、17、21 和 25 的 VLX 1.0.17 运行时已覆盖 24 个受支持的平台组合;JDK 8 保留原有 ZIP overlay 路径并继续使用 VLX 1.0.11。 - 修复应用
module-info.class的兼容性扫描。模块描述符不含方法体,现在会自动排除在加密范围之外,同时仍可由描述符工具正常读取。 - GUI 导出的 CLI 命令现在可以把
--java-version、--target-platform和--create-new-folder作为连续后缀放在打包器参数之后;原有的前缀写法继续兼容。
6.0.9 2026-07-25
加密应用打印空指针异常时的崩溃修复
- 修复了一个 JVM 崩溃问题:当受保护方法抛出隐式
NullPointerException、且应用读取其消息或打印堆栈时可能触发。运行时的「友好 NPE 提示」功能会尝试从该方法的加密字节码中还原 "because ... is null" 说明文本,进而解引用非法内存、导致 VM 崩溃(在 JavaFX FXML 应用中观察到)。受保护方法现在会跳过该说明文本,退回为标准的NullPointerException;异常类型、堆栈以及应用自行提供的消息均不受影响。 - JDK 17、21 和 25 的运行时随本次修复重建为 VLX 1.0.16。JDK 11 不受影响,因为「友好 NPE 提示」功能在 JDK 14 之前并不存在,继续保持 VLX 1.0.15;JDK 8 继续保持 VLX 1.0.11。
6.0.8 2026-07-24
按需下载的 Tomcat 运行时与生产安全默认值
- 修复已发布的自保护编码器无法打包 Tomcat WAR 的问题:
app.p4jx中的 Tomcat 类不再以物理 classpath JAR 的形式可见。Tomcat 9.0.107 和 10.1.53 现在作为不可变、带版本号的 R2/COS 制品,按 Servlet 命名空间自动选择,首次使用时下载并缓存在本地,同时核对精确 SHA-256 和 JAR 清单。被篡改的缓存会被丢弃并重新下载。 - 公开的
WEB-INF/libJAR 现在会作为按应用隔离、受 Hash 绑定的物理 Web 资源落盘,避免 Spring 启动期间为每个类重复读取和校验嵌套归档。 - 新构建现在默认使用生产许可端点
https://protector4j.com。只有显式设置P4JX_LICENSE_MODE=dev或-PlicenseMode=dev时,才会使用内部端点http://10.10.10.16:16002。
6.0.7 2026-07-24
Tomcat 嵌套依赖与可信动态类
- 修复受保护的 Tomcat WAR 从
WEB-INF/lib/*.jar加载类或服务时的失败。Protector4J 现在会将嵌套 JAR 和类的精确 SHA-256 元数据密封到app.p4jx中;未知、被替换或被篡改的依赖仍会被拒绝。 - 修复 JDK 11 的
MethodHandles.Lookup#defineClass使用 JDK 11 特有来源标记而导致的 Spring CGLIB 和 Hibernate Byte Buddy 失败。动态信任仍必须来自 VM 已验证的调用类或加载器来源;标记字符串、类名、路径、包名和CodeSource均不能授予信任。 - 为 JDK 11、17、21 和 25 发布 VLX 1.0.15 运行时,覆盖 24 个受支持平台组合。全部通过严格的 L1-L5 门禁,包括真实 FXML、Swing/AWT、Tomcat 嵌套依赖加载,以及来源和篡改负向场景。JDK 8 继续保持 VLX 1.0.11。
6.0.6 2026-07-22
可信类定义来源传播
- 修复受保护 JavaFX FXML 应用启动失败的问题:
MethodUtil会通过defineClass(byte[])定义已由 VM 验证来源的Trampoline辅助类。现在信任只从 VM 已验证的类或加载器来源传播,不再来自类名、路径、包名或CodeSource字符串。 - 新增真实 FXML 覆盖,包括
fx:controller、属性元素、Controller 注入和 WebView 启动,并增加可信动态定义、两级传播、未知来源、未授权 JAR 以及替换 protected class 名称的回归测试。 - 发布 JDK 11、17、21 和 25 的 VLX 1.0.14 运行时。JDK 8 继续保持 VLX 1.0.11。
6.0.5 2026-07-21
JavaFX 原生运行时完整性
- 通过将打包后的 JavaFX DLL 文件置于
vlxjre/bin,并调整启动器的原生库搜索路径,解决了 Windows 环境下 JavaFX WebView 启动失败的问题(Graphics Device initialization failed/No toolkit found)。 - 将加密的
app.p4jx允许列表扩展到外部原生库。无论路径如何,JavaFX 原生文件都必须与精确的 SHA-256 值匹配,同时 Glass 会重新验证实际加载的文件;无法识别或被篡改的文件将被拒绝。 - 为 JDK 11、17、21 和 25 发布了更新后的 Protector4J 运行时。所支持的 JavaFX 平台组合已通过 L5.1-L5.4,覆盖 WebView 启动,以及对模块 JAR、
jdk.jsobject和 Glass 原生库的篡改拒绝。
6.0.4 2026-07-21
外部模块完整性及 JavaFX 运行时兼容性
- 已取消对外部模块基于路径的信任机制。现在,每个外部模块 JAR 都必须与嵌入
app.p4jx的精确 SHA-256 允许列表条目匹配;无论位于何处,未识别或被篡改的文件都会被拒绝。 - 增加了从 JavaFX
module-info.class自动检测依赖闭包的功能,并严格控制指定 JavaFX 和 JDK 模块的准入,包括javafx.media和jdk.jsobject。 - 通过新发布的 P4JX 运行时,修复了所有受支持 JDK 版本及平台上的 JavaFX WebView 启动问题,以及启动层建立后的 E818 /
ClassFormatError错误。
6.0.3 2026-07-20
JavaFX WebView 模块兼容性
- 修复由相同 JDK/VLX 版本重新构建的受支持 P4JX 运行时的可选
jdk.jsobject解析问题。打包不再仅因完整lib/modules镜像字节不同而拒绝兼容运行时。 - 保留按训练线和平台选择制品、模块精确 SHA-256 与模块名校验,并在安装后重新验证依赖闭包。
6.0.2 2026-07-20
JavaFX WebView 兼容性
- 修复 JavaFX WebView 启动失败:将
javafx.media与javafx.web一起打包,并在裁剪运行时未包含模块时自动解析与 P4JX 精确匹配的jdk.jsobject。 - 新增从区域公共下载服务获取可选模块的功能;制品固定 SHA-256 并绑定版本、平台和运行时。已经包含该模块的运行时会跳过下载。
6.0.1 2026-07-20
JavaFX 兼容性
- 修复内嵌 JavaFX 运行时类的 fat JAR 启动失败问题。兼容性自动应用现在会让内嵌的 JavaFX API、实现和 JNI 桥接命名空间保持未加密,避免与随包 JavaFX 模块发生重复归属冲突。
- 改进对 shaded JavaFX 运行时应用的兼容性诊断和多语言指引。
6.0.0 2026-07-20
Protector4J 6.0 是建立在全新保护架构上的重大版本,并非 5.x 系列的普通增量更新。
架构与防护
- 重新设计 Protector4J 的基础架构,并引入全新的 P4JX 保护引擎。
- 在归档生成、类加载、运行时执行、反调试和制品完整性等层面增加接近 100 道防护措施。
- 大幅提高逆向分析门槛。新架构的目标是在使用先进 AI 辅助分析工具的情况下,也让短期破解变得极其困难。
- 增强许可请求、运行时下载、制品校验和跨平台安装包的安全性。
产品体验
- 支持 JDK 8、11、17、21 和 25,并为 Java、JavaFX、Spring Boot 和 Tomcat 应用提供可视化打包流程。
- 新增兼容性扫描、选择性类加密、依赖 JAR 保护、YAML 任务导入/导出以及多目标平台批量构建。
- 重新设计桌面界面,支持 11 种语言并可持久保存语言偏好。
迁移说明
Protector4J 6.0 与之前版本在使用方式上存在较大差异。使用前请重新阅读最新文档,并尽快使用 6.0 重新构建和迁移已有加密应用,以获得更强大的保护。
早期版本
更新日志
5.7.0 2026-03-07
- 添加 JDK25 支持
5.6.2 2026-01-03
- 修复 JRE 下载问题
- 修复 pidkiller 问题
5.6.1 2025-08-13
- 运行问题修复
5.6.0 2025-08-09
- 修复 GraphQL 资源问题
5.5.1 2025-06-01
- 修复资源下载问题
5.5.0 2025-04-19
- 修复解码器相关问题
5.4.1 2025-04-17
- 使用最新 Go 版本构建 pidchecker
5.4.0 2025-04-08
- 更新 JDK17 至 17.0.14
5.3.5 2025-03-26
- 更新可执行文件包装器
5.3.4 2025-03-08
- 修复在某些 Windows 系统上无法运行的问题
5.3.3 2025-02-20
- 修复在某些 Windows 系统下无法运行的问题
5.3.2 2025-02-04
- 修复 Java 库加密引入的错误 META-INF 问题
5.3.1 2025-01-28
- 修复无法在低版本 CPU 上运行的问题
5.3.0 2025-01-25
- 添加 jdk.naming.dns 模块
5.2.0 2025-01-19
- 新解码器
5.1.0 2025-01-12
- 修复 Windows 下解码器误报问题
5.0.0 2024-12-28
- 添加单独加密 Java 库支持(预览版),允许应用程序使用普通 JRE 运行
4.8.1 2024-12-08
- 修复处理 Tomcat 任务时未检查文件类型的问题
4.8.0 2024-11-30
- 修复无法在 Windows 7 上运行的问题
- 修复 jdk.net 模块未导入的问题
4.7.1 2024-09-19
- 修复生成的 Linux 应用程序无法正常运行的问题
4.7.0 2024-09-08
- 修复生成的程序无法在 macOS 下运行的问题
- 修复安全软件误报问题
4.6.2 2024-07-21
- 为 SpringBoot 应用添加从库中移除 application.properties 文件的选项
- 添加滚动条以解决窗口过小时元素显示不全的问题
4.6.1 2024-05-25
- 修复 Mac 上重复下载 vlxjre8 的问题
- 修复加载 TaskInfo 时 JVM 选项丢失的问题
4.6.0 2024-04-30
- 更新 JDK 以解决登录模块缺失问题
- 更新 add-permission-script.sh
4.5.3 2024-03-16
- 添加 Tomcat 10.1.19
4.5.2 2024-03-02
- 修复 Windows 下的包装器问题
4.5.1 2024-03-01
- 修复 Java 21 签名问题
4.5.0 2024-02-25
- 修复虚拟线程无法工作的问题
4.4.0 2024-02-24
- 修复解码器相关问题
4.3.0 2024-02-06
- 更新 Tomcat 至 9.0.85
4.2.2 2024-01-31
- 移除无用的 wrapper.json 文件
4.2.1 2024-01-25
- 修复权限脚本问题
4.2.0 2024-01-23
- 修复管道断开导致应用退出的问题
- 修复 /tmp 文件夹自动清理导致应用退出的问题
- 修复 Java 8 在 macOS 上找不到 libfreetype 的问题
- 修复多个 application.properties 存在时的冲突问题
4.1.0 2023-10-30
- 修复 JDK8 问题
- 修复 Linux 和 macOS 上的管道断开问题
- 中国用户现可选择服务器 https://protector4j.cn
4.0.1 2023-10-24
- 升级解码器
4.0.0 2023-10-17
- 添加 Java 21 支持
- 安全性增强,提供更强的保护
3.3.0 2023-09-29
- 修复 Tomcat 项目无法正常启动的问题
- 项目中存在重复类时发出警告
3.2.0 2023-08-24
- 修复多语言环境下 Windows 编码问题
3.1.1 2023-08-02
- 修复非英文路径下的乱码问题
3.1.0 2023-07-22
- 修复 ZipInputStream 相关问题
- 修复 ZipFileSystem 相关问题
- 修复其他问题
3.0.2 2023-05-29
- 修复 Windows 上的解码问题
3.0.1 2023-05-25
- 修复 mac-aarch64 版本启动问题
3.0.0 2023-05-20
- 全新应用启动系统
- 全新解码系统
- Java 8 现可使用 -jar 命令运行程序
2.12.5 2023-05-12
- 修复 macOS 上 jdk8 找不到 freetype 的问题
2.12.4 2023-02-28
- 更新后端