首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Javac 編譯器官方文檔深度解讀:參數詳解、類搜尋策略與交叉編譯

     編輯:Java 程式設計入門

命令語法總覽

javac [options] [sourcefiles] [@files]
# 別名 oldjavac 行為一致
  • options:編譯器選項,順序任意。
  • sourcefiles:一個或多個 .java 文件路徑。
  • @files:包含文件列表的文本文件,每行一個路徑,用 @filelist 引用。

核心選項分類表

類別選項說明
目標版本-source 源碼語言版本(如 1.8, 11, 17)
-target 生成類文件版本(向後兼容)
--release JDK 9+ 一鍵設定 source/target/bootstrap
-encoding 源文件編碼(必加:UTF-8)
輸出控制-d 類文件輸出根目錄(按包結構)
-s 生成源碼輸出目錄(注解處理器用)
-h 生成 JNI 頭文件目錄
類路徑-cp / -classpath 用戶類搜尋路徑,覆蓋 CLASSPATH 環境變量
-sourcepath 源文件搜尋路徑(默認同類路徑)
-bootclasspath 覆蓋 bootstrap 類(交叉編譯用)
調試資訊-g生成所有調試信息(行號、變量、源文件)
-g:none / -g:{lines,vars,source}精細控制
其他-verbose輸出編譯細節(載入類、編譯文件)
-Xlint[:key]啟用推薦警告(unchecked, deprecation, rawtypes...)
-Xdiags:verbose詳細診斷輸出
-parameters保存方法參數名(反射獲取)
-proc:{none,only}控制注解處理

類搜尋策略(關鍵機制)

  1. Bootstrap 類(JRE 核心庫,-bootclasspath 可改)。
  2. Extension 類(-extdirs 指定)。
  3. 用戶類路徑(-cp / CLASSPATH)。

搜尋順序:Bootstrap → Extension → User。
找到 .class 與 .java 同時存在時,比較修改時間(或 -Xdepend 依賴分析)決定是否重編譯。
隱式編譯:引用的未列在命令行的類會被自動編譯,-verbose 可觀察。

文件列表(@files)用法

# sources.txt
com/example/Main.java
com/example/util/Helper.java
com/example/model/User.java

javac @sources.txt

適合大型項目、構建腳本動態生成列表。

交叉編譯實戰

在 JDK 17 上編譯兼容 JDK 8 的類:

javac --release 8 -d out -encoding UTF-8 @sources.txt

--release 8 等價於 -source 8 -target 8 -bootclasspath /jre/lib/rt.jar,自動配置正確的 bootstrap 類庫,避免誤用新 API。

常見錯誤與對策

  • error: package not found:檢查 -cp 是否包含依賴 JAR 目錄。
  • error: unmappable character for encoding UTF-8:源文件實際非 UTF-8,補 -encoding GBK 或轉碼文件。
  • class file has wrong version:-target 版本過高,運行環境 JVM 版本過低。
  • 注解處理器未生效:確認 -proc:only 或 META-INF/services 配置正確。

現代構建工具集成

實際項目請使用 Maven Compiler Plugin 或 Gradle Java Plugin 統一管理上述參數,避免手動敲命令:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <release>17</release>
    <encoding>UTF-8</encoding>
    <parameters>true</parameters>
    <compilerArgs><arg>-Xlint:all</arg></compilerArgs>
  </configuration>
</plugin>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved