CLI 參數參考

本文的範例使用安裝後提供的 p4j 命令。Windows 的 GUI 由 .exe 安裝,macOS 的 GUI 由 .dmg 中的 Protector4J.app 安裝;GUI 的安裝方式不會改變下面的 CLI 語法。如果安裝程式沒有把 CLI 加入 PATH,請從 Protector4J 安裝目錄中的命令列入口執行。

p4j --help

1. 命令

p4j encode     <input.jar> <output.p4jx|output.jar> [選項]
p4j javaapp    <input.jar> <輸出目錄> [選項]
p4j springboot <input.jar> <輸出目錄> [選項]
p4j tomcat     <input.war> <輸出目錄> [選項]

底層的 encode 還允許省略命令名稱:

p4j input.jar output.p4jx [選項]

啟動層級的選項用於選擇打包目標。它們可以寫在命令名稱之前,也可以作為整條命令末端的連續字尾 —— GUI 匯出的命令列採用的就是字尾寫法。

選項說明
--java-version <N>隨包的 Java 訓練線:8、11、17、21 或 25,預設 21
--target-platform <id>[,<id>...]一個或多個目標平臺,以逗號分隔或重複使用該選項。預設為目前平臺。
--create-new-folder在輸出目錄中新建一個 p4jx-xxxxxxxx 子目錄。僅適用於 javaappspringboottomcat

例如:

p4j --java-version 21 --target-platform linux-x64 springboot app.jar dist
p4j springboot app.jar dist --java-version 21 --target-platform linux-x64

這兩條命令等價。啟動層級的選項不能夾在打包器選項中間,否則會被當成未知的打包器選項而報錯。

2. 通用選項

選項說明
--jre-home <path>以指定的 P4JX 最終 JRE 執行時衍生金鑰;高層打包命令還會複製該執行時
--keys <keys.json>使用私有的明確金鑰檔案。僅限診斷與內部流程使用,絕不能隨應用程式散布。
--no-jit讓受保護方法不進入 JIT,改為解譯器執行
--zip-overlay off|scanner關閉或啟用掃描器 ZIP 相容檢視,預設 off
--compat-scan只掃描後結束,不需要輸出參數
--compat-apply掃描、套用保守建議,然後繼續編碼
--no-compat-excludes搭配 --compat-apply 使用:不自動追加建議的排除類別
--native-compat jxbrowser僅適用於 javaappspringboot:為內建的 JxBrowser 申請准入。版本、平臺與五層雜湊仍會完整驗證,不接受其他值、路徑或雜湊。
--account-email <email>授權帳號電子郵件
--account-password <password>授權帳號密碼
--app-id <id>應用程式識別碼
--license-expires-in <sec>要求的試用有效秒數,受伺服器政策約束

高層打包命令另外支援:

選項說明
--archive-suffix p4jx|jar產生歸檔的檔案字尾,預設 p4jx;不改變內部格式
--jvm-option <option>寫入 macOS、Linux 與 Windows 的啟動指令碼。每個選項用一次,可重複使用。啟用 Windows EXE 時,同一組選項也會固化進 EXE。

3. encode

p4j encode input.jar output.p4jx [選項]
選項說明
--bind-launcher <jar>計算並繫結啟動器 JAR 的 SHA-256
--launcher-sha256 <hex>直接傳入啟動器的 SHA-256,供進階整合使用
--runtime-major <N>資源檢視與 Multi-Release 攤平的目標版本,預設 21

--bind-launcher--launcher-sha256 不能同時使用。

4. javaapp

p4j javaapp input.jar 輸出目錄 [選項]
選項說明
--main <class>指定啟動的主類
--protect <rules>要保護的類別與套件規則,以逗號分隔。預設保護全部類別。
--exclude <rules>要從保護範圍中排除的規則
--javafx [<dir>]啟用 JavaFX,可選指定本機元件目錄
--javafx-webview強制納入 WebView
--no-javafx-webview強制排除 WebView
--no-javafx明確停用 JavaFX
--native-compat jxbrowser為完整命中內建目錄的 JxBrowser IPC 函式庫寫入 ATTACH_THREAD。僅支援 Java 17、21、25。

5. springboot

p4j springboot input.jar 輸出目錄 [選項]
選項說明
--main <class>指定 Spring Boot 主類,預設從資訊清單讀取
--protect <rules>保護 BOOT-INF/classes 中相符的類別
--exclude <rules>排除相符的類別或套件
--protect-lib <globs>保護 BOOT-INF/lib 中相符的 JAR,以逗號分隔
--layout p4jx-fat|fat|separate輸出佈局,預設 p4jx-fat
--javafx [<dir>]啟用 JavaFX,可選指定本機元件目錄
--javafx-webview強制納入 WebView
--no-javafx-webview強制排除 WebView
--no-javafx明確停用 JavaFX
--native-compat jxbrowserjavaapp 相同;巢狀的 BOOT-INF/lib 由同一個掃描器涵蓋。

6. tomcat

p4j tomcat input.war 輸出目錄 [選項]
選項說明
--exclude <rules>排除 WEB-INF/classes 中相符的類別或套件
--context </path>上下文路徑,預設 /app
--append-app把應用程式追加到既有的 P4JX Tomcat 包中
--tomcat-version auto|9|10自動偵測或強制指定版本。CLI 預設為 auto
--precompile-jsp強制預先編譯 JSP
--no-precompile-jsp關閉 JSP 預先編譯

7. Windows EXE 選項

javaappspringboottomcat 可以額外產生一個原生 Windows 啟動程式,要求目標平臺中包含 windows-x64windows-x86windows-aarch64

選項說明
--windows-exe產生 Windows 應用程式 EXE。不傳入則不產生。
--exe-name <name>EXE 檔案名稱;留空時使用輸入檔案的名稱,tomcat 包使用 tomcat
--exe-mode <mode>console(預設)或 gui
--exe-icon <ico>選用的 Windows 圖示,.ico 格式
--exe-file-version <a.b.c.d>PE 檔案版本:1 到 4 段數字,每段取值 0 到 65535。留空表示 0.0.0.0
--exe-product-version <a.b.c.d>PE 產品版本,規則同上
--exe-company <text>公司名稱
--exe-product <text>產品名稱
--exe-description <text>檔案說明
--exe-copyright <text>版權聲明

任何一個 --exe-* 選項都會自動啟用 EXE 產生。多平臺任務只會在 Windows 子包中產生 EXE,其他平臺的子包照常產生並保留啟動指令碼。

p4j --target-platform windows-x64 javaapp app.jar dist --windows-exe --exe-name MyApp.exe --exe-mode gui

完整說明、執行行為與程式碼簽章步驟,請見產生 Windows EXE 啟動器

8. 規則寫法

com.example.SecretService   單一類別
com.example.service         只比對目前套件
com.example.service.*       只比對目前套件
com.example.service.**      目前套件及其所有子套件
com/example/Secret.class    類別項目路徑

多條規則以逗號分隔。規則中含 * 時要加上引號,避免被 shell 展開:

--protect 'com.example.**' --exclude 'com.example.dto.**,com.example.config.**'

9. 環境變數

環境變數適合為 CI 工作、容器,或連續執行的多條命令設定共用的預設值。當某一次打包需要被記錄與重現時,還是應當把值當作 CLI 選項明確寫出來。

環境變數對應的 CLI 選項說明
P4JX_RUNTIME_JAVA_VERSION--java-version <N>高層打包使用的 Java 訓練線:8、11、17、21 或 25
P4JX_RUNTIME_PLATFORM--target-platform <id>單一目標平臺。一次打包多個平臺時請使用 CLI 選項。
P4JX_RUNTIME_CACHE_DIR覆寫 VLX JRE 的下載快取目錄
APP_JAVA_OPTS可對照 --jvm-option執行產生的應用程式時臨時追加 JVM 選項。--jvm-option 是在打包時把選項寫進啟動指令碼,兩者並不等價。

同時設定了環境變數與對應的 CLI 選項時,明確的 CLI 選項優先。環境變數仍然完整支援,既有的自動化指令碼可以繼續使用。

例如,在目前的 shell 中為後續多條打包命令設定共用目標:

export P4JX_RUNTIME_JAVA_VERSION=21
export P4JX_RUNTIME_PLATFORM=linux-x64

p4j springboot service-a.jar release/service-a
p4j springboot service-b.jar release/service-b

如果你是直接啟動打包器 JAR 的進階用法,可以改用等價的 Java 系統屬性:

-Dp4jx.runtime.java.version=<N>
-Dp4jx.runtime.platform=<platform>
-Dp4jx.runtime.cache.dir=<dir>

10. 自動化範例

p4j --java-version 21 \
  --target-platform linux-x64 \
  springboot build/app.jar release/linux-x64 \
  --compat-apply \
  --protect 'com.example.service.impl.**' \
  --exclude 'com.example.dto.**,com.example.config.**' \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g \
  --app-id com.example.app

明確指定的保護、排除與佈局選項會覆寫自動建議。建議把最終參數、輸入檔案的 SHA-256 與工具版本一併記錄為發行溯源資訊。

GUI 與 CLI 的範例,以及直接編輯 run.shrun.bat、Tomcat 啟動指令碼與 Windows PowerShell 的寫法,請見 JVM 啟動選項設定