首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux javac 不編譯子目錄源文件的原因與解決方案

     編輯:程式設計綜合問答

現象

執行 javac *.java 僅編譯當前目錄下的 .java 文件,子目錄下的源文件未被編譯。

原因

*.java 是 Shell 通配符,**由 Shell (bash/zsh) 展開**,而非 javac 內部遞歸查找。Shell 預設不遞歸匹配子目錄 (除非開啟 globstar 並用 **/*.java)。

解決方案

方案一:使用 javac 內建遞歸編譯 (推薦)

javac 支持直接指定源文件根目錄,配合 -sourcepath 和 -d:

# 從 src 目錄編譯所有子目錄 java 文件,輸出到 build 目錄
javac -sourcepath src -d build src/com/example/**/*.java

**注意**:**/*.java 仍需 Shell 支持 (bash 4.0+ 需 shopt -s globstar)。

方案二:find + xargs (最通用、跨 Shell)

find src -name "*.java" | xargs javac -d build -sourcepath src
  • find 遞歸查找所有 .java 文件。
  • xargs 將文件列表傳給 javac。
  • 適用於所有 POSIX Shell,無需 globstar。

方案三:啟用 bash globstar (僅限 bash 4.0+)


shopt -s globstar
javac -d build -sourcepath src src/**/*.java

方案四:使用構建工具 (專業項目標配)

**不要手寫 javac 命令**。使用:

  • Maven:mvn compile (標準目錄結構 src/main/java)
  • Gradle:gradle compileJava
  • Ant:ant compile

構建工具自動處理依賴、增量編譯、類路徑、測試、打包等全生命周期。

關鍵參數說明

參數作用
-sourcepath指定源文件根目錄,javac 据此解析包結構
-d指定 .class 文件輸出根目錄
-cp / -classpath指定依賴庫路徑
-encoding UTF-8指定源文件編碼,避免中文亂碼

總結

javac *.java 不遞歸是 **Shell 通配符機制** 決定的。生產環境請直接使用 **Maven/Gradle**;臨時測試用 find ... | xargs javac 最可靠。理解 Shell 與編譯器職責邊界,是 Java 開發者的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved