Java啟動器(java命令)啟動JVM後,按固定優先級順序搜索並加載類:
rt.jar、i18n.jar等核心庫中。jre/lib/ext)。-classpath、-cp或CLASSPATH環境變量指定路徑。三者邏輯上串聯為單一類路徑,但具有關鍵差異:引導類難以被隱藏/覆蓋;通常只需指定用戶類路徑,系統自動解析引導與擴展類;工具類(tools.jar)獨立歸檔,僅在用戶類路徑包含時可用。
引導類路徑由系統屬性sun.boot.class.path確定,指向jre/lib下的核心JAR。極少數情況需替換核心類庫時,可使用非標準選項-Xbootclasspath重新定義。注意:tools.jar(編譯器、javadoc等工具類)不在引導類路徑中,啟動器調用工具時會將其加入用戶類路徑,但javac和javadoc處理源碼時仍使用初始類路徑。
擴展目錄(jre/lib/ext)下每個JAR文件自動視為擴展,由擴展框架加載。無法通過啟動器選項改變擴展目錄位置。
com.mypackage.MyClass存放於/myclasses/com/mypackage/MyClass.class,則/myclasses必須在類路徑中。myclasses.jar含com/mypackage/MyClass.class。-jar選項 > -cp/-classpath > CLASSPATH環境變量 > 默認值「.」(當前目錄)。-jar時,所有用戶類僅來自指定JAR,忽略其他路徑。JAR清單(Manifest)中的Class-Path屬性可擴展類路徑,僅在從該JAR加載類時生效。搜索順序:類路徑前段 → JAR Class-Path引用的JAR → 類路徑後段。優化機制:若引用JAR已在類路徑更前位置被搜索(如擴展類或前序類路徑),則跳過重複搜索,防止循環依賴。若JAR作為擴展安裝在ext目錄,其Class-Path被忽略(假定依賴已滿足)。
針對1.1風格安全管理器或與1.2類結構不兼容的舊代碼(如經過混淆器處理),提供oldjava啟動器。它將引導類與用戶類合併在單一類路徑中,通過CLASSPATH或-cp指定,存儲於java.class.path系統屬性。
javac和javadoc雙重角色:自身運行需加載類;解析源碼引用需獲取被引用類型信息。解析用類文件多與運行時相同,但例外:
tools.jar工具類僅用於運行工具,不參與源碼解析(除非在用戶類路徑中)。-bootclasspath、-extdirs指定編譯/文檔目標平台的引導/擴展類,不影響工具自身運行類集。-sourcepath則僅搜索指定源文件路徑。javadoc優先使用源文件;javac使用類文件並自動重編譯過期類。oldjava提供臨時支持。理解類加載層級、路徑優先級、JAR Class-Path語義、工具類查找差異及安全綁定,是排查ClassNotFoundException、NoClassDefFoundError、版本衝突、熱部署失效等疑難雜症的前提。建議開發者熟練掌握-verbose:class輸出分析、jcmd PID VM.classloader_stats等診斷手段。