使用 javac 編譯包含多個類、存在包結構、相互依賴的 Java 項目,是否必須逐個手動編譯?
直接編譯入口類,編譯器會自動編譯所有依賴類。
D:\code\java\
├── test\
│ ├── Test.java // 主類,包含 main
│ ├── a\
│ │ └── A.java // package test.a;
│ └── b\
│ └── B.java // package test.b; import test.a.A;
// test/a/A.java
package test.a;
public class A { }
// test/b/B.java
package test.b;
import test.a.A;
public class B extends A { }
// test/Test.java
package test;
import test.b.B;
import test.a.A;
public class Test {
public static void main(String[] args) {
A b = new B();
}
}
# 在 D:\code\java 目錄下執行
javac -d . test\Test.java
-d .:指定輸出目錄為當前目錄,自動創建包目錄結構test\Test.java:指定入口類(包含 main 方法的類)Test.java,發現依賴 test.b.B 和 test.a.Atest/b/B.java, test/a/A.javaB 依賴 A,A 無依賴A → B → Test.class 文件至對應包目錄:./test/a/A.class 等java -cp . test.Test
# 編譯當前目錄及子目錄所有 .java 文件
javac -d . $(find . -name "*.java") # Linux/Mac
javac -d . **/*.java # Windows PowerShell
# 或
javac -d . test/a/*.java test/b/*.java test/*.java
但推薦指定入口類,避免編譯測試類、廢棄代碼。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| 找不到符號: 類 X | 源文件路徑與包聲明不匹配 | 確保目錄結構 = 包結構,從源根目錄編譯 |
| 依賴類未編譯或輸出目錄錯誤 | 使用 -d 統一輸出,編譯入口類 | |
| 重複類 | 同類名出現在不同包/無包中 | 規範包結構,避免默認包 |
javac 具備完整的依賴解析能力。從源根目錄,用 -d . 指定輸出,編譯入口類,即可自動完成多文件、多包、相互依賴項目的編譯。無需手動逐個編譯,無需構建工具(Maven/Gradle)即可輕鬆管理中小型項目。