保護 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 庫進行迴歸。