JDK 提供的核心開發工具中,javac(編譯器)與 java(運行器)是最基礎也最常用的兩個命令。本文系統梳理其參數、工作流程、常見坑點,助你從「能跑」走向「懂原理」。
javac將 .java 源文件編譯為 .class 位元碼文件。
javac [選項] 源文件.java
| 選項 | 說明 |
|---|---|
-d 目錄 | 指定 .class 輸出目錄(保持包結構) |
-cp / -classpath 路徑 | 指定類搜尋路徑 |
-sourcepath 路徑 | 指定源文件搜尋路徑 |
-encoding UTF-8 | 指定源文件編碼,避免中文亂碼 |
-g | 生成所有調試資訊(行號、變量) |
-nowarn | 關閉警告輸出 |
-version | 顯示編譯器版本 |
默認行為:無 -d 時,.class 與 .java 同目錄。
java啟動 JVM,載入類,執行 main 方法。
java [選項] 全限定類名 [參數...]
com.example.Main)。java Main ≠ java main。java [選項] -jar 文件.jar [參數...]
MANIFEST.MF 指定 Main-Class。-jar 會忽略 -cp/CLASSPATH。| 選項 | 說明 |
|---|---|
-cp / -classpath | 類搜尋路徑(非 -jar 模式) |
-Xms | 初始/最大堆大小 |
-ea / -da | 啟用/禁用斷言 |
-Dkey=value | 設置系統屬性,程式中 System.getProperty("key") 獲取 |
-verbose:class | 輸出類加載資訊 |
-version / -showversion | 顯示 JVM 版本 |
# 目錄結構
src/com/example/Main.java
# 編譯到 out 目錄
javac -d out -encoding UTF-8 src/com/example/Main.java
# 執行
java -cp out com.example.Main arg1 arg2
找不到或無法加載主類:類名拼寫錯誤、缺少包名、-cp 路徑錯誤、文件名與類名不一致。UnsupportedClassVersionError:編譯版本高於運行版本(如 JDK 17 編譯,JDK 11 運行),用 -target/--release 降級或升級運行環境。中文亂碼:編譯加 -encoding UTF-8,運行確保終端編碼一致。NoClassDefFoundError:編譯時存在,運行時缺失依賴,檢查 -cp 或 JAR 完整性。模塊項目需使用 --module-source-path、--module-path、-m 模塊/主類,不再依賴傳統 -cp。
熟練掌握 javac/java 參數,能快速定位構建與部署問題,也是理解 Maven/Gradle 等構建工具底層原理的基石。