保護 JavaFX 應用程式

一般 Java 應用程式與 Spring Boot 桌面應用程式都可以啟用 JavaFX。P4JX 的精簡執行時預設不含 JavaFX,需要在打包時明確啟用,或由相容性掃描替你啟用。

1. GUI 操作

  1. 一般 JavaFX 應用程式在應用程式類型頁面選擇 Java 應用;建立在 Spring 容器上的 JavaFX 桌面應用程式則選擇 Spring Boot類庫加密只會產生受保護歸檔,無法取代真正的 JavaFX 應用程式打包。

    選擇 Java 應用或 Spring Boot

  2. 選擇輸入 JAR、隨包 Java 版本與目標平臺,然後選擇簡單模式或進階模式。JavaFX 元件會依每個目標 Java 版本與平臺分別取得,因此多平臺任務會產生彼此獨立的輸出包。

    選擇輸入、Java 版本、目標平臺與模式

  3. 使用簡單模式時,相容性掃描若發現 javafx.* 參考或 JavaFX 相依套件,會自動啟用 JavaFX,並在掃描結果中說明原因;若同時發現 javafx.scene.web,還會一併納入 WebView。掃描屬於靜態啟發式分析,進入輸出頁後仍應核對 JavaFX 摘要。

  4. 使用進階模式時,在 JavaFX 執行時頁籤中勾選將 JavaFX 內建到打包執行時,再選擇 WebView 策略:

    • 自動(檢測 javafx.scene.web):依應用程式是否參考 javafx.scene.web 決定;
    • 包含:一律納入 WebView(fx-webkit);
    • 排除:一律不納入 WebView。

    一般 Java 應用程式的入口如下:

    在一般 Java 應用程式的進階參數中選擇 JavaFX 執行時

    Spring Boot 桌面應用程式使用同名頁籤:

    在 Spring Boot 的進階參數中選擇 JavaFX 執行時

  5. 選擇輸出目錄後,確認參數摘要中 JavaFX 顯示為已內建、WebView 狀態符合預期,再點選執行保護。產生完成後,請使用包內的啟動指令碼,在每個目標平臺上驗證視窗、FXML、CSS 與圖片資源以及 WebView。

WebView 元件大約 40 MB,用不到時可以選擇排除以縮小包的體積。進階頁面中其他設定的意義,請見 Protector4J 進階模式設定

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

工具會依目標 JDK 訓練線與平臺,從目前區域的公開下載站臺取得對應元件。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 覆蓋層:

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

FXML 資源、控制器簽章與框架掃描,都必須在目標平臺上實際啟動應用程式來驗證。

5. Java 8 與 Java 11 以上

  • Java 8 使用 jfxrt.jar 與擴充目錄模型,產生的指令碼通常不需要模組參數。
  • Java 11 以上使用模組化的 JavaFX JAR,產生的指令碼會自動設定專用的模組路徑與 --add-modules

請一律透過產生的 run.shrun.commandrun.bat 啟動,不要自行把整個 vlxjre/lib 當成模組路徑。

6. 自動偵測的判斷依據

偵測器會檢查你自己程式碼中的類別參考,以及相依 JAR 的檔案名稱。它刻意不去深入掃描每一個第三方相依套件的位元組碼,否則會把僅屬選用的 JavaFX 整合誤判為實際使用。

如果 JavaFX 被 shade 進了一個從名稱看不出來的相依套件中,自動偵測可能會漏掉,這時請明確傳入 --javafx

7. 保護範圍建議

  • JavaFX Application 子類別、FXML 控制器與屬性模型是否保護,應以目標 Java 版本上的實測結果為準。
  • 由 JNI 或原生程式碼直接存取的橋接類別應維持不受保護。
  • 先用簡單模式或 --compat-scan,再針對視窗建立、FXML 載入、CSS 與圖片資源、WebView 以及平臺原生函式庫做迴歸測試。