Protector4J 進階模式設定
進階模式可以手動設定保護範圍、相容性選項,以及各應用程式類型專屬的選項。第一次處理某個新應用程式時,建議先用簡單模式,或在進階選項頁面先執行一次相容性掃描,再依掃描結果調整。
本文是 GUI 使用指南中進階模式一節的展開說明。要判斷哪些類別應當維持不受保護,請參閱相容性與保護範圍;要寫出等價的自動化命令,請參閱 CLI 參數參考。
1. 進入進階模式
- 選擇應用程式類型,並選好輸入的 JAR 或 WAR。
- 選擇隨包 Java 版本與至少一個目標平臺。
- 在模式中選擇高階——自行定製選項。
- 點選下一步進入進階選項頁面。
如果你已經在輸出確認頁,點選**自定義…**即可回到進階選項頁面。修改完成後回到輸出頁,確認摘要已經反映出新的設定。
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 相關選項 |
| Tomcat | Tomcat 版本、上下文路徑、要排除的類 | 未選擇版本;上下文路徑為 /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 佈局,對於以 ZipInputStream 或 JarInputStream 從記憶體串流解析歸檔的情境也無能為力。
對應的 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 應用的選項

主類
留空時,從輸入 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 的選項

主類
留空時,從資訊清單中讀取 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 版本
- WAR 使用
javax.servlet.*時,選擇 Tomcat 9 · javax; - WAR 使用
jakarta.servlet.*時,選擇 Tomcat 10.1 · jakarta。
Tomcat 10.1 至少需要 Java 11。不確定時先執行一次相容性掃描。如果應用程式同時用到 javax 與 jakarta,不要強行選定版本,應當先解決相依衝突。
進階模式不會預先選定版本,你必須接受掃描建議或手動選擇一個才能繼續。對應的 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子目錄。
產生之後,必須在每個目標平臺上用包內的啟動指令碼驗證啟動、框架掃描、序列化、反射、資源載入與核心商業流程。進階選項設定正確,只能說明任務參數設對了,不能取代對最終產物的驗證。