Protector4J 進階模式設定

進階模式可以手動設定保護範圍、相容性選項,以及各應用程式類型專屬的選項。第一次處理某個新應用程式時,建議先用簡單模式,或在進階選項頁面先執行一次相容性掃描,再依掃描結果調整。

本文是 GUI 使用指南中進階模式一節的展開說明。要判斷哪些類別應當維持不受保護,請參閱相容性與保護範圍;要寫出等價的自動化命令,請參閱 CLI 參數參考

1. 進入進階模式

  1. 選擇應用程式類型,並選好輸入的 JAR 或 WAR。
  2. 選擇隨包 Java 版本與至少一個目標平臺。
  3. 模式中選擇高階——自行定製選項
  4. 點選下一步進入進階選項頁面。

如果你已經在輸出確認頁,點選**自定義…**即可回到進階選項頁面。修改完成後回到輸出頁,確認摘要已經反映出新的設定。

Java 版本與目標平臺無法在進階選項頁面修改,需要調整請返回輸入頁。多平臺任務會為每個平臺產生獨立的輸出,它們的 vlxjre 不能互換。

2. 通用選項

四種應用程式類型共用這個區域,但部分設定只對特定類型生效。類庫加密不會產生啟動指令碼,因此沒有 JVM 啟動選項;它的歸檔字尾設定用於建議並同步輸出檔案名稱。

設定預設值作用建議
歸檔字尾p4jx把應用程式歸檔命名為 .p4jx.jar維持 .p4jx。只有當第三方元件寫死了 .jar 檔案名稱時才改為 jar
對受保護方法禁用 JIT關閉讓受保護方法只在解譯器中執行程式碼高度敏感、且已評估過效能代價時再開啟。
追加掃描器 ZIP 覆蓋層關閉為掃描 ZIP 結構的工具提供一個相容檢視只在相容性掃描建議開啟,或應用程式確實會讀取實體 ZIP 結構時才開啟。
JVM 啟動選項把 JVM 選項寫入產生的啟動指令碼每行填寫一個完整的選項。
相容性掃描…不自動執行掃描輸入並給出保守建議新應用程式、框架升級之後,以及調整保護範圍之後,都重新執行一次。

各應用程式類型專屬的選項如下:

應用程式類型專屬選項初始狀態對應的 CLI 選項
Java 應用主類、要排除的類、JavaFX 與 WebView主類取自資訊清單;不排除任何類別;不打包 JavaFX--main--exclude--javafx--javafx-webview / --no-javafx-webview
Spring Boot主類、佈局、保護依賴 JAR、要排除的類、JavaFX 與 WebView主類取自 Start-Class;佈局為 p4jx-fat;不保護相依套件;不排除任何類別;不打包 JavaFX--main--layout--protect-lib--exclude,以及 JavaFX 相關選項
TomcatTomcat 版本、上下文路徑、要排除的類未選擇版本;上下文路徑為 /app;不排除任何類別--tomcat-version--context--exclude

「不排除任何類別」是指預設保護該應用程式類型的全部應用程式類別,並不表示第三方相依套件也一併保護 —— Spring Boot 的 BOOT-INF/lib 與 Tomcat 的 WEB-INF/lib 預設都不在保護範圍內。

歸檔字尾

選擇 jar 只改變檔案名稱,內容仍然是 P4JX:既不能用一般的 ZIP 或 JAR 工具開啟,也無法由標準 JRE 載入。對類庫加密而言,這個設定會在 .p4jx.jar 之間切換輸出檔案的字尾;如果你自行填寫了其他字尾,則保留你寫的完整檔案名稱。

對應的 CLI 選項:

--archive-suffix p4jx
--archive-suffix jar

對受保護方法禁用 JIT

開啟對受保護方法禁用 JIT之後,受保護方法不會進入 JIT 編譯器,藉此減少編譯後機器碼的暴露面。這可能讓運算密集的程式碼明顯變慢。這個設定只影響受保護方法,不會讓整個 JVM 進入純解譯執行模式。

對應的 CLI 選項:

--no-jit

掃描器 ZIP 覆蓋層

覆蓋層只暴露公開資源、目錄與受保護類別的中繼資料樁,絕不包含真實的方法主體。它的作用是讓直接讀取 ZIP 中央目錄的工具仍然可用。它無法取代 Spring Boot 的 fat 佈局,對於以 ZipInputStreamJarInputStream 從記憶體串流解析歸檔的情境也無能為力。

對應的 CLI 選項:

--zip-overlay scanner

JVM 啟動選項

每行填寫一個完整的選項,例如:

-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8

每一行就是一個選項,絕對不要把兩個選項寫在同一行。這些選項會寫入 macOS、Linux 與 Windows 的啟動指令碼;對 Tomcat,還會寫入它的啟動路徑。類庫加密不產生啟動指令碼,因此該輸入欄位無法使用。更完整的各平臺範例請見 JVM 啟動選項設定

對應的 CLI 寫法是重複該選項:

--jvm-option -Xms512m --jvm-option -Xmx2g

3. 相容性掃描與掃描建議

四種應用程式類型都可以點選**相容性掃描…**來掃描目前的輸入。接受掃描結果後,工具會把該應用程式類型對應的建議合併進目前的設定,主要包括:

  • 追加應當維持不受保護的類別;
  • 啟用掃描器 ZIP 覆蓋層;
  • 調整歸檔字尾;
  • 為 Java 應用或 Spring Boot 啟用 JavaFX 與 WebView;
  • 為 Spring Boot 選擇佈局;
  • 為 Tomcat 選擇 9 或 10.1。

類庫加密只會自動套用掃描器 ZIP 覆蓋層與歸檔字尾這兩項建議。它的設計目標就是保護輸入 JAR 中的全部類別,不支援排除;因此掃描若發現必須維持不受保護的內容(例如 JNI 或原生類別),報告會明確建議你把這些類別移到一般 JAR 中,或改用支援選擇性保護的打包模式。

接受建議之後仍然可以繼續編輯。掃描會保留你既有的排除規則,也不會因為沒偵測到 JavaFX 就把你手動開啟的 JavaFX 關掉。取消對話方塊則不會套用任何建議。

報告中屬於程式碼層面的風險 —— Agent、JNI、自訂類別載入器、執行時修改位元組碼 —— 通常不是改個開關就能解決的。請依照相容性與保護範圍調整程式碼邊界,然後實際測試。

4. Java 應用的選項

一般 Java 應用程式的進階參數

主類

留空時,從輸入 JAR 的資訊清單中讀取 Main-Class。只有當清單裡沒有主類,或需要覆寫它時,才填寫完整類別名稱,例如 com.example.Main

對應的 CLI 選項:--main com.example.Main

要排除的類

預設保護全部應用程式類別。列在這裡的類別與套件維持不受保護,適用於 DTO、實體、設定類別、JNI 橋接類別,以及任何會被框架增強、或需要讀取自身真實位元組碼的類別。規則寫法請見下文「保護範圍與排除規則」。

JavaFX 執行時

一般 JavaFX 應用程式請勾選將 JavaFX 內建到打包執行時。WebView 有三種策略可選:

  • 自動(檢測 javafx.scene.web):偵測到 javafx.scene.web 時才納入;
  • 包含:一律納入 fx-webkit
  • 排除:一律不納入。

WebView 大約會增加 40 MB。GUI 會為你的目標 Java 版本與平臺下載相應元件;如果需要指定本機離線的 JavaFX 目錄,請使用 CLI。

對應的 CLI 選項:--javafx--javafx-webview--no-javafx-webview自動沒有額外選項,因為它由打包器依應用程式自身的參考來判斷。

5. Spring Boot 的選項

Spring Boot 的進階參數

主類

留空時,從資訊清單中讀取 Start-Class。需要覆寫時,填寫完整類別名稱。

對應的 CLI 選項:--main com.example.Application

佈局

佈局適用情境
p4jx-fat預設佈局。標準的 Spring Boot 服務,保護範圍最廣。
fat應用程式需要實體的 Spring Boot JAR 結構,例如使用 ClassGraph 或 Reflections。
separate要求 lib/* 扁平類別路徑的舊有整合環境。

如果相容性掃描明確建議使用 fat,就不要強行改回 p4jx-fat 再指望靠 ZIP 覆蓋層頂上。各佈局的詳細說明請見保護 Spring Boot 應用程式

對應的 CLI 選項:--layout p4jx-fat--layout fat--layout separate

保護依賴 JAR…

BOOT-INF/lib 中的相依套件預設不受保護。只勾選你自有的閉源相依套件,不要加密 Spring、Tomcat、記錄函式庫、資料庫驅動程式這類第三方框架套件。已簽章的 JAR 無法勾選,因為修改它們會破壞簽章。

勾選某個相依套件後,其中的全部類別都會受保護,但你仍然可以用要排除的類把其中特定的類別或套件排除出去。三種 Spring Boot 佈局都支援保護相依套件。

對應的 CLI 選項:--protect-lib 'company-core.jar,company-domain.jar'。CLI 還支援 glob 萬用字元寫法;GUI 記錄的則是你所勾選 JAR 的精確檔案名稱。

要排除的類與 JavaFX

用法與 Java 應用程式完全相同。排除規則同時作用於應用程式類別與你選擇保護的相依 JAR。Spring Boot 桌面應用程式也可以在 JavaFX 執行時頁籤中打包 JavaFX 與 WebView。

6. Tomcat 的選項

Tomcat 的進階參數

Tomcat 版本

  • WAR 使用 javax.servlet.* 時,選擇 Tomcat 9 · javax
  • WAR 使用 jakarta.servlet.* 時,選擇 Tomcat 10.1 · jakarta

Tomcat 10.1 至少需要 Java 11。不確定時先執行一次相容性掃描。如果應用程式同時用到 javaxjakarta,不要強行選定版本,應當先解決相依衝突。

進階模式不會預先選定版本,你必須接受掃描建議或手動選擇一個才能繼續。對應的 CLI 選項為 --tomcat-version 9--tomcat-version 10,CLI 還接受 auto

上下文路徑

填寫以 / 開頭的部署路徑,例如 /app。留空時使用 /app。要往既有的 Tomcat 輸出目錄追加應用程式時,上下文路徑不能與既有應用程式衝突。

對應的 CLI 選項:--context /app

要排除的類

預設保護 WEB-INF/classes 下的應用程式類別,WEB-INF/lib 不在保護範圍內。Servlet、Filter、Listener、DTO、設定類別、實體、JNI 橋接類別,以及需要由容器增強的類別,通常都應當排除。

7. 保護範圍與排除規則

進階模式下,GUI 預設保護全部應用程式類別,你透過要排除的類來劃定框架邊界。支援三種規則寫法:

com.example.SecretService   只比對這一個類別
com.example.service.*       只比對目前套件,不含子套件
com.example.service.**      比對目前套件及其所有子套件

可以用**選擇…從類別樹中挑選,也可以用新增…**手動輸入。選取一個套件時,預設涵蓋該套件及其子套件;用 .* 可以限定為只包含該套件本身。Spring Boot 的類別樹還會顯示你選擇保護的相依 JAR。

建議的組織方式是:公開邊界或框架進入點 → 一般 facade 或介面 → 受保護的核心實作。不要為了讓保護面看起來更大,就把所有第三方相依套件與框架進入點一併加密。

8. 匯出、重複使用與最終複查

點選匯出參數…可以匯出一個 p4j-task.yml 任務檔案,該檔案可以手動編輯。它會記錄目前已解析的選項,但絕不會寫入帳號電子郵件與密碼。之後可以透過視窗頂端的載入任務檔案還原任務;該入口同時仍能讀取舊版本匯出的 p4j-encrypt-run.sh.bat 指令碼。

進入輸出頁後,至少要複查以下內容:

  • 輸入檔案、應用程式類型、Java 版本與全部目標平臺;
  • 歸檔字尾、JIT 設定、掃描器覆蓋層與 JVM 啟動選項;
  • JavaFX 與 WebView、Spring Boot 佈局,或 Tomcat 版本與上下文路徑;
  • 已選擇保護的相依 JAR 與全部排除規則;
  • 輸出目錄,以及是否新建 p4jx-xxxx 子目錄。

產生之後,必須在每個目標平臺上用包內的啟動指令碼驗證啟動、框架掃描、序列化、反射、資源載入與核心商業流程。進階選項設定正確,只能說明任務參數設對了,不能取代對最終產物的驗證。