保护 JavaFX 应用
普通 Java 应用和 Spring Boot 桌面应用都可启用 JavaFX。P4JX 的精简运行时默认不含 JavaFX,必须在打包时显式或经兼容性建议启用。
1. GUI 操作
-
普通 JavaFX 应用在应用类型页选择 Java Application;使用 Spring 容器的 JavaFX 桌面应用选择 Spring Boot。Library Encryption 只生成保护归档,不能代替 JavaFX 应用打包。

-
选择输入 JAR、随包 Java 版本和目标平台,然后选择简单模式或高级模式。JavaFX 素材按每个目标 Java 版本和平台分别获取;多平台任务会生成相互独立的输出包。

-
使用简单模式时,兼容性扫描如果发现
javafx.*引用或 JavaFX 依赖,会在扫描结果中说明调整原因,并自动启用 JavaFX;如果发现javafx.scene.web,还会包含 WebView。扫描是静态启发式分析,进入输出页后仍应复核 JavaFX 摘要。 -
使用高级模式时,在 JavaFX runtime 页签中勾选 Bundle JavaFX into the packaged runtime,再选择 WebView 策略:
- Auto:根据应用是否引用
javafx.scene.web自动判断; - Include:强制包含 WebView(
fx-webkit); - Exclude:强制不包含 WebView。
普通 Java 应用的入口如下:

Spring Boot 桌面应用使用同名页签:

- Auto:根据应用是否引用
-
选择输出目录后,确认参数摘要中 JavaFX 显示为已内置,WebView 状态与预期一致,再点击 Run protection。生成后使用包内启动脚本在每个目标平台验证窗口、FXML、CSS/图片资源和 WebView。
WebView 素材约 40 MB,不使用时可选择 Exclude 以缩小包体。高级界面中其他设置的含义见 Protector4J 高级模式设置和其 Spring Boot 设置。
2. CLI 在线获取
p4j javaapp fx-app.jar dist --javafx
Spring Boot JavaFX:
p4j springboot fx-boot.jar dist --javafx
强制包含或排除 WebView:
--javafx-webview
--no-javafx-webview
工具根据目标 Java 训练线和平台,从当前区域的公开下载站点取得对应素材。JavaFX 下载与 VLX JRE 下载都不需要把云存储密钥交给客户端。
3. 离线素材
CLI 支持本地目录:
p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx
目录可包含:
fx-core.tar.gz与可选的fx-webkit.tar.gz;或- 已展开、以
lib/为根的 JavaFX 文件树。
GUI 不提供本地 JavaFX 目录选择;离线场景请使用 CLI。
4. FXML
如果应用使用 FXMLLoader,兼容性扫描会建议开启扫描器 ZIP overlay:
p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner
FXML 相关资源、控制器签名和框架扫描需要在目标平台进行实际启动测试。
5. Java 8 与 Java 11+
- Java 8 使用
jfxrt.jar/扩展目录模型,生成脚本通常不需要模块参数。 - Java 11+ 使用模块化 JavaFX JAR,生成脚本自动设置专用 module path 和
--add-modules。
始终使用生成的 run.sh、run.command 或 run.bat,不要自行把整个 vlxjre/lib 当作 module path。
6. 自动检测边界
检测器扫描应用自己的类引用,并根据依赖 JAR 文件名判断 JavaFX。它不会深入扫描所有第三方依赖的字节码,以避免把可选 JavaFX 集成误判为实际使用。
如果 JavaFX 被 shade 到一个名称看不出 JavaFX 的依赖中,自动扫描可能漏报;此时显式使用 --javafx。
7. 保护范围建议
- JavaFX
Application子类、FXML Controller 和属性模型是否保护,应以目标 Java 版本的实测结果为准。 - JNI/native 直接访问的桥接类应保持普通类。
- 先用简单模式或
--compat-scan,再对窗口打开、FXML 加载、CSS/图片资源、WebView 和平台 native 库进行回归。