Changelog
6.0.18 2026-08-13
Multi-release JAR support in the Spring Boot p4jx-fat layout
- Fixed multi-release dependencies being loaded from their base version in the Spring Boot
p4jx-fatlayout. When unpacking a nestedBOOT-INF/libJAR, the class loader stored entries under their literal names, so classes underMETA-INF/versions/were never selected and the base-version fallback was always used. A concrete symptom: with Spring Framework 7.0.5,VirtualThreadDelegateresolved to its base-version stub, which throwsUnsupportedOperationExceptionunconditionally, so an application running on JDK 25 withspring.threads.virtual.enabled=truefailed to start. Many widely used dependencies ship as multi-release JARs, so other version-specific code paths were affected in the same way. - The class loader now resolves multi-release entries at load time, picking the highest version that the running JDK supports, and the packager applies the same resolution when it builds the fat resource index, so the index and the loader always agree on which entry wins. The other two layouts,
fatandseparate, were never affected because they keep dependencies as ordinary JAR files that the JVM opens itself.
6.0.17 2026-08-13
Startup fix for protected applications on Windows paths with non-ASCII characters
- Fixed protected applications failing to start on Windows when their path contains non-ASCII characters, such as Chinese. Depending on where the path was misread, the launch failed either with archive error
E816or with a decryption failure surfacing asClassFormatError. The runtime opened the archive and normalised paths byte by byte, so a character encoded in a legacy code page whose second byte happens to be0x5C— the backslash — was split down the middle, and its tail was read as a directory separator. Many everyday Chinese characters encode that way in GBK. Paths made up only of ASCII characters were never affected. - On Windows the runtime now converts paths to wide characters through the system ANSI code page before opening files and before computing the runtime fingerprint, which is how the stock JDK has always opened files. Only the Windows code path changed; Linux and macOS behave exactly as before. All five JDK lines were rebuilt with the fix: JDK 25, 21 and 17 to VLX 1.0.22, JDK 11 to VLX 1.0.20, and JDK 8 to VLX 1.0.13.
6.0.16 2026-08-10
Windows packaging fix for Linux and macOS targets
- Fixed a packaging failure on Windows when the target platform is Linux or macOS. Extracting the bundled runtime reported
Failed to extract P4JX runtimeeven though the runtime had in fact been extracted correctly. Windows cannot create symbolic links without elevated privileges, and the Linux and macOS runtimes contain slightly over a hundred of them underlegal/— license texts that jlink points atjava.baseinstead of duplicating. Thetarcommand shipped with Windows treats those as warnings and still returns a non-zero exit code, which the encoder read as a hard failure and then deleted the extracted runtime. Packaging on Windows for a Windows target was never affected, because the Windows runtimes contain no symbolic links at all. - Archive handling no longer depends on the platform's
tarcommand. The encoder now reads and extracts.tar.gzruntimes and JavaFX assets itself, so the behaviour is identical on Windows, Linux, and macOS. File permissions, including the launcher's executable bit, come from the archive itself rather than from the host file system. On Windows the license symlinks are skipped: they carry no runtime function and are not part of the runtime fingerprint, so applications protected on Windows decrypt exactly as they did before.
6.0.15 2026-08-08
Update dialog fixes
- The "New Version" dialog now opens at a fixed, reasonable size instead of stretching to fill the entire screen when the changelog is long.
- Added a "Check for Updates" entry to the toolbar, so you can check for a newer release at any time, not only at startup.
6.0.14 2026-08-07
Inline string-constant encryption, now the default
- Added an inline string-protection mode that rewrites
ldcstring loads into a call to a synthetic per-class decrypt method, removing a string constant's plaintext from the constant pool entirely. The plaintext no longer enters theSymbolTableat class load, appears on the heap only when that code actually runs, and unused strings stay encrypted. The ciphertext travels inside the class body and is covered by the existing per-method encryption, so this is a pure encoder-side bytecode transform: the archive format and the runtime are unchanged, and it works on every supported JDK line with no runtime update. - String protection is now a single option with three modes — None, Standard (constant-pool V72), and Inline — and Inline is the default for every application type, including Tomcat. It was validated end to end on ordinary servlets, string-
switchbusiness logic, and JspC-precompiled JSP servlet classes. The CLI flag is--encrypt-strings none|constant|inline, and the GUI offers the same choice. - A method that cannot be rewritten — an interface in an old class-file format, a method near the 64 KB code limit, or a rare serialization edge case — falls back to the standard V72 layer, so the result is never weaker than before.
Faster Spring Boot p4jx-fat startup
- The pure-fat Spring Boot class loader now reads its nested-resource index on demand instead of eagerly, cutting startup work for large p4jx-fat applications.
Account credentials from environment variables
- The
encode,javaapp,springboot, andtomcatcommands and task-file mode can now read the account email and password fromP4JX_ACCOUNT_EMAILandP4JX_ACCOUNT_PASSWORD(orP4JX_ACCOUNT_PASSWORD_MD5), used only when the matching command-line option is absent, so an exported task file stays free of credentials.
6.0.13 2026-08-05
Startup fix for protected applications that use javax.lang.model
- Fixed
NoClassDefFoundError: javax/lang/model/SourceVersionat startup in protected applications whose frameworks reference thejavax.lang.modelAPI — most notably Spring Data JPA, whose repository AOT processor touchesSourceVersionwhile the container initializes. Thejava.compilermodule, previously removed from the bundled runtime, is now included again. It is an API-only module with no compiler implementation, soToolProvider.getSystemJavaCompiler()still returnsnullandjdk.compilerstays absent — the protection surface is unchanged. - JDK 17, 21, and 25 runtimes are rebuilt to VLX 1.0.21, and JDK 11 to VLX 1.0.19, all carrying the restored
java.compilermodule. JDK 8 is unaffected because it has no module system and already provides these classes.
6.0.12 2026-08-02
JxBrowser 9 support, and a crash fix for protected applications that throw NullPointerException
- Protected applications can now embed JxBrowser 9.
--native-compat jxbrowserselects one of the nine built-in catalog versions, 9.0.0 through 9.3.1, across seven platforms on Java 17, 21, and 25. The runtime grants thread-attach permission only to the official IPC library whose SHA-256 is registered for the selected version, and re-checks the calling module when a thread actually attaches. Paths, hashes, and library names are never accepted from the command line. On macOS 26, use JxBrowser 9.0.1 or later: TeamDev fixed a Chromium crash during Engine creation in that release, and 9.0.0 crashes there on a plain JDK as well. - Fixed
ClassFormatErrorin protected applications that throw aNullPointerException. The 6.0.9 fix suppressed the JVM's helpful-NPE message per method, which turned out to be insufficient: that feature parses method bodies as standard bytecode, and no per-method flag can prove the parse is valid once P4JX has transformed them. The runtime now disables the extended message unconditionally. The exception type, stack trace, and any application-supplied message are unaffected. JDK 17, 21, and 25 runtimes are rebuilt to VLX 1.0.20; JDK 11 is unaffected and stays on VLX 1.0.18, and JDK 8 stays on VLX 1.0.12. java -versionnow reports the VLX runtime build, so a packaged runtime can be identified without unpacking it.- The two Windows EXE version fields are now validated before packaging starts, instead of failing partway through. Windows stores each component as an unsigned 16-bit integer, so each of the one to four dot-separated numbers must be between 0 and 65535. Leaving the fields empty still means 0.0.0.0.
6.0.11 2026-07-27
Native Windows launchers for protected applications
- Added optional native Windows EXE generation to Java App packages, all three Spring Boot layouts, and Tomcat packages. Console and GUI launchers are available for Windows x64, x86, and ARM64, while the existing launch scripts remain in every package.
- Added CLI and GUI settings for the EXE filename, mode, icon, and Windows version metadata. Multi-platform tasks generate an EXE only for selected Windows targets, and the settings are preserved in version 2 of
p4j-task.yml; version 1 task files remain readable. - Integrated the pure Win32 JExeKit launcher with the packaged
vlxjre, exact classpath and JVM arguments. Launchers reject paths that escape the package, reparse-point substitutions, and unsafe agent or boot-classpath options before starting Java. - JExeKit templates are embedded only as AES-GCM-encrypted
.jxtresources and decrypted in memory for generation. Every generated launcher carries a production-status Ed25519 signature over its parameter block; icon, version, manifest, and parameter changes finish before the user's finalAuthenticodesignature.
6.0.10 2026-07-27
Faster, structure-preserving Tomcat dependency loading
- Fixed severe Tomcat startup slowdowns caused by re-reading and hashing an entire protected
WEB-INF/libnested JAR whenever a class was loaded. VLX 1.0.17 now verifies each sealed nested JAR once, caches its authenticated provenance inside the VM, and continues to validate every requested class against the encrypted class index. - Removed the temporary
web-libsextraction and mounting workaround.WEB-INF/lib/*.jarremains inside the protected.p4jxarchive, preserving the original WAR structure and application isolation. VLX 1.0.17 runtimes are published for JDK 11, 17, 21, and 25 across 24 supported platform combinations; JDK 8 keeps its existing ZIP overlay path and remains on VLX 1.0.11. - Fixed compatibility scanning for application
module-info.class. Module descriptors are now automatically excluded from encryption because they contain no method bodies, while remaining readable by descriptor tools. - CLI commands exported by the GUI can now place
--java-version,--target-platform, and--create-new-folderafter the packager arguments as a contiguous suffix. The existing prefix form remains supported.
6.0.9 2026-07-25
Crash fix for encrypted apps that surface null-pointer exceptions
- Fixed a JVM crash that could occur when a protected method threw an implicit
NullPointerExceptionand the application read its message or printed its stack trace. The runtime's helpful-NPE detail feature tried to rebuild the "because ... is null" text from the method's encrypted bytecode and dereferenced invalid memory, crashing the VM (observed with JavaFX FXML applications). Protected methods now skip the detail message and fall back to a standardNullPointerException; the exception type, stack trace, and any application-supplied message are unaffected. - JDK 17, 21, and 25 runtimes are rebuilt to VLX 1.0.16 with this fix. JDK 11 is unaffected because the helpful-NPE feature does not exist before JDK 14 and stays on VLX 1.0.15; JDK 8 stays on VLX 1.0.11.
6.0.8 2026-07-24
Downloadable Tomcat runtimes and production-safe defaults
- Fixed the released self-protected encoder failing to package Tomcat WARs because Tomcat classes inside
app.p4jxwere no longer visible as a physical classpath JAR. Tomcat 9.0.107 and 10.1.53 are now immutable, versioned R2/COS artifacts selected by servlet namespace, downloaded on first use, cached locally, and verified against an exact SHA-256 and JAR manifest. Tampered caches are discarded and downloaded again. - Public
WEB-INF/libJARs are now staged as per-application, hash-bound physical web resources, avoiding repeated nested-archive reads and verification for each class during Spring startup. - New builds now default to the production license endpoint at
https://protector4j.com. The internalhttp://10.10.10.16:16002endpoint is used only whenP4JX_LICENSE_MODE=devor-PlicenseMode=devis explicitly selected.
6.0.7 2026-07-24
Nested Tomcat dependencies and trusted dynamic classes
- Fixed protected Tomcat WARs that load classes or services from
WEB-INF/lib/*.jar. Protector4J now seals exact nested JAR and class SHA-256 metadata intoapp.p4jx; unknown, replaced, or tampered dependencies remain rejected. - Fixed JDK 11 Spring CGLIB and Hibernate Byte Buddy failures caused by
MethodHandles.Lookup#defineClassusing a JDK 11-specific source marker. Dynamic trust still requires VM-verified caller or loader provenance; marker strings, class names, paths, packages, andCodeSourcedo not grant trust. - Published VLX 1.0.15 runtimes for JDK 11, 17, 21, and 25 across 24 supported platform grids. All passed strict L1-L5 gates, including real FXML, Swing/AWT, Tomcat nested-dependency loading, and negative provenance and tamper cases. JDK 8 remains on VLX 1.0.11.
6.0.6 2026-07-22
Trusted class-definition provenance
- Fixed protected JavaFX FXML startup failures caused by
MethodUtildefining its verifiedTrampolinehelper throughdefineClass(byte[]). Trust now propagates only from VM-verified class or loader provenance, not from class names, paths, packages, orCodeSourcestrings. - Added real FXML coverage with
fx:controller, property elements, controller injection, and WebView startup, plus regressions for trusted dynamic definitions, two-level propagation, unknown sources, unauthorized JARs, and protected-name replacement. - Published VLX 1.0.14 runtimes for JDK 11, 17, 21, and 25. JDK 8 remains on VLX 1.0.11.
6.0.5 2026-07-21
JavaFX native runtime integrity
- Fixed Windows JavaFX WebView startup failures (
Graphics Device initialization failed/No toolkit found) by placing packaged JavaFX DLLs invlxjre/binand aligning the launcher's native library search. - Extended the encrypted
app.p4jxallowlist to external native libraries. JavaFX native files must match exact SHA-256 values regardless of path, and Glass revalidates the actual loaded file; unrecognized or tampered files are rejected. - Published refreshed Protector4J runtimes for JDK 11, 17, 21, and 25. Supported JavaFX grids passed L5.1-L5.4, covering WebView startup plus tamper rejection for module JARs,
jdk.jsobject, and Glass native libraries.
6.0.4 2026-07-21
External module integrity and JavaFX runtime compatibility
- Removed path-based trust for external modules. Every external module JAR must now match an exact SHA-256 allowlist entry embedded in
app.p4jx; unrecognized or tampered files are rejected regardless of location. - Added automatic dependency-closure detection from JavaFX
module-info.classand controlled admission of pinned JavaFX and JDK modules, includingjavafx.mediaandjdk.jsobject. - Fixed JavaFX WebView startup and post-boot-layer E818 /
ClassFormatErrorfailures across supported JDK trains and platforms with newly released P4JX runtimes.
6.0.3 2026-07-20
JavaFX WebView module compatibility
- Fixed optional
jdk.jsobjectresolution for supported P4JX runtimes rebuilt from the same JDK/VLX version. Packaging no longer rejects a compatible runtime solely because its completelib/modulesimage has different bytes. - Retained train/platform-specific artifact selection, exact module SHA-256 and module-name validation, and dependency-closure verification after installation.
6.0.2 2026-07-20
JavaFX WebView compatibility
- Fixed JavaFX WebView startup failures by packaging
javafx.mediatogether withjavafx.weband automatically resolving the exact P4JX-matchedjdk.jsobjectmodule when a pruned runtime does not include it. - Added SHA-256-pinned, version/platform/runtime-bound optional module downloads from the regional public download service. Runtimes that already include the module skip the download.
6.0.1 2026-07-20
JavaFX compatibility
- Fixed startup failures for fat JARs that embed JavaFX runtime classes. Compatibility Apply now keeps embedded JavaFX API, implementation, and JNI bridge namespaces unencrypted, avoiding duplicate ownership with packaged JavaFX modules.
- Improved compatibility diagnostics and multilingual guidance for applications with shaded JavaFX runtimes.
6.0.0 2026-07-20
Protector4J 6.0 is a major release built on a redesigned protection architecture, rather than an incremental update to the 5.x series.
Architecture and protection
- Redesigned the foundational architecture of Protector4J and introduced the new P4JX protection engine.
- Added nearly 100 protection measures across archive generation, class loading, runtime execution, anti-debugging, and artifact integrity.
- Significantly raised the barrier to reverse engineering. The new architecture is designed to make short-term cracking extremely difficult, even with advanced AI-assisted analysis tools.
- Strengthened license requests, runtime downloads, artifact verification, and cross-platform installer security.
Product experience
- Added support for JDK 8, 11, 17, 21, and 25, with graphical packaging workflows for Java, JavaFX, Spring Boot, and Tomcat applications.
- Added compatibility scanning, selective class encryption, dependency JAR protection, YAML task import/export, and batch builds for multiple target platforms.
- Redesigned the desktop interface with support for 11 languages and persistent language preferences.
Migration notes
Protector4J 6.0 differs substantially from earlier versions. Please read the latest documentation before using it, and rebuild and migrate your encrypted applications to 6.0 as soon as practical to benefit from the stronger protection.
Earlier releases
Changelog
5.7.0 2026-03-07
- Add support for JDK25
5.6.2 2026-01-03
- Fix jre download issue
- Fix pidkiller issue
5.6.1 2025-08-13
- running issue
5.6.0 2025-08-09
- Fix GraphQL resource issue
5.5.1 2025-06-01
- Fix the resource downloading issue
5.5.0 2025-04-19
- Fix issues about decoder
5.4.1 2025-04-17
- Build pidchecker with latest go version
5.4.0 2025-04-08
- Update JDK17 to 17.0.14
5.3.5 2025-03-26
- Update the executable wrapper
5.3.4 2025-03-08
- Fix the issue of not being able to run on some Windows systems
5.3.3 2025-02-20
- Fix the issue of not running under some Windows systems
5.3.2 2025-02-04
- Fix the issue of incorrect META-INF introduced by JAVA library encryption
5.3.1 2025-01-28
- Fix the issue of not being able to run on lower version CPUs
5.3.0 2025-01-25
- Add jdk.naming.dns module
5.2.0 2025-01-19
- New decoder
5.1.0 2025-01-12
- Fix the false positive issue of the decoder under Windows.
5.0.0 2024-12-28
- Add support for encrypted Java library alone(Preview), allowing the application to run with normal jre
4.8.1 2024-12-08
- Fix the issue of not checking file types when processing Tomcat tasks.
4.8.0 2024-11-30
- Fix the issue of not being able to run on Windows 7
- Fix the issue of the jdk.net module not being imported
4.7.1 2024-09-19
- Fix the issue that the generated linux app does not run properly
4.7.0 2024-09-08
- Fix the issue that the generated program can't run under macOS
- Fix the issue about false positive of security software
4.6.2 2024-07-21
- Add option to remove application.properties file from libraries for SpringBoot applications
- Add a scrollbar to solve the issue that the elements on the window are not fully displayed when the window is too small.
4.6.1 2024-05-25
- Fix the issue of repeated downloads of vlxjre8 on Mac.
- Fix the problem of missing JVM options when loading TaskInfo.
4.6.0 2024-04-30
- Update jdk to solve the login module missing issue
- Update add-permission-script.sh
4.5.3 2024-03-16
- Add tomcat 10.1.19
4.5.2 2024-03-02
- Fixed the wrapper issue under Windows
4.5.1 2024-03-01
- Fixed the signature issue about Java 21
4.5.0 2024-02-25
- Fixed the issue that virtual thread can't work
4.4.0 2024-02-24
- Fixed issue about decoder
4.3.0 2024-02-06
- Update Tomcat to 9.0.85
4.2.2 2024-01-31
- Remove the unuseful wrapper.json file
4.2.1 2024-01-25
- Fixed the issue of permission script
4.2.0 2024-01-23
- Fixed the issue that broken pipe causes app to exit
- Fixed the issue that /tmp folder auto-cleanup causes app to exit
- Fixed the issue that Java 8 cannot find libfreetype on macos
- Fixed the issue that conflicts exist when multiple application.properties exist
4.1.0 2023-10-30
- Fixed a problem with JDK8
- Fixed a broken pipe issue on Linux and macOS.
- Chinese users can now select the server as https://protector4j.cn
4.0.1 2023-10-24
- Upgrade decoder
4.0.0 2023-10-17
- Added support for Java 21
- Security enhancements for stronger protections
3.3.0 2023-09-29
- Fixed a problem where Tomcat projects would not start properly.
- Warns when duplicate classes exist in a project
3.2.0 2023-08-24
- Fixed a problem with Windows coding in multi-language environments
3.1.1 2023-08-02
- Fixed garbled code in non-English paths
3.1.0 2023-07-22
- Fixed ZipInputStream related issues.
- Fixed ZipFileSystem related issues
- Fixed other issues
3.0.2 2023-05-29
- Fixed decoding problems on Windows
3.0.1 2023-05-25
- Fixed startup problems with mac-aarch64 version
3.0.0 2023-05-20
- New application startup system
- New decoding system
- Java 8 can now run programs with the -jar command
2.12.5 2023-05-12
- Fixed jdk8 not finding freetype on macOS
2.12.4 2023-02-28
- Update backend