保护 JavaFX 应用

普通 Java 应用和 Spring Boot 桌面应用都可启用 JavaFX。P4JX 的精简运行时默认不含 JavaFX,必须在打包时显式或经兼容性建议启用。

1. GUI 操作

  1. 普通 JavaFX 应用在应用类型页选择 Java Application;使用 Spring 容器的 JavaFX 桌面应用选择 Spring BootLibrary Encryption 只生成保护归档,不能代替 JavaFX 应用打包。

    选择 Java Application 或 Spring Boot

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

    选择输入、Java 版本、目标平台和模式

  3. 使用简单模式时,兼容性扫描如果发现 javafx.* 引用或 JavaFX 依赖,会在扫描结果中说明调整原因,并自动启用 JavaFX;如果发现 javafx.scene.web,还会包含 WebView。扫描是静态启发式分析,进入输出页后仍应复核 JavaFX 摘要。

  4. 使用高级模式时,在 JavaFX runtime 页签中勾选 Bundle JavaFX into the packaged runtime,再选择 WebView 策略:

    • Auto:根据应用是否引用 javafx.scene.web 自动判断;
    • Include:强制包含 WebView(fx-webkit);
    • Exclude:强制不包含 WebView。

    普通 Java 应用的入口如下:

    在普通 Java 应用高级参数中选择 JavaFX runtime

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

    在 Spring Boot 高级参数中选择 JavaFX runtime

  5. 选择输出目录后,确认参数摘要中 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.shrun.commandrun.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 库进行回归。