執行 javac *.java 僅編譯當前目錄下的 .java 文件,子目錄下的源文件未被編譯。
*.java 是 Shell 通配符,**由 Shell (bash/zsh) 展開**,而非 javac 內部遞歸查找。Shell 預設不遞歸匹配子目錄 (除非開啟 globstar 並用 **/*.java)。
javac 支持直接指定源文件根目錄,配合 -sourcepath 和 -d:
# 從 src 目錄編譯所有子目錄 java 文件,輸出到 build 目錄
javac -sourcepath src -d build src/com/example/**/*.java
**注意**:**/*.java 仍需 Shell 支持 (bash 4.0+ 需 shopt -s globstar)。
find src -name "*.java" | xargs javac -d build -sourcepath src
find 遞歸查找所有 .java 文件。xargs 將文件列表傳給 javac。
shopt -s globstar
javac -d build -sourcepath src src/**/*.java
**不要手寫 javac 命令**。使用:
mvn compile (標準目錄結構 src/main/java)gradle compileJavaant compile構建工具自動處理依賴、增量編譯、類路徑、測試、打包等全生命周期。
| 參數 | 作用 |
|---|---|
-sourcepath | 指定源文件根目錄,javac 据此解析包結構 |
-d | 指定 .class 文件輸出根目錄 |
-cp / -classpath | 指定依賴庫路徑 |
-encoding UTF-8 | 指定源文件編碼,避免中文亂碼 |
javac *.java 不遞歸是 **Shell 通配符機制** 決定的。生產環境請直接使用 **Maven/Gradle**;臨時測試用 find ... | xargs javac 最可靠。理解 Shell 與編譯器職責邊界,是 Java 開發者的基本功。