jvm的類加載分三中方式
系統級別rtjar
擴展級別java_home/jre/lib/ext/目錄下的jar文件
應用級別環境變量中的classpath或javac java中的參數指定java classpath
或者自己寫ClassLoader加載
前面中是JVM自動處理其中第二種是為了處理Java的classpath災難而提供的解決方案
實際上java虛擬機是由java luncher初始化的也就是java(或javaexe)
這個程序來做的 虛擬機按以下順序搜索並裝載所有需要的類:
引導類: 組成java平台的類 包含rtjar和injar中的類
擴展類: 使用java擴展機制的類都是位於擴展目錄($JAVA_HOME/jre/lib/ext)
中的jar檔案包
用戶類: 開發者定義的類或者沒有使用 java 擴展機制的第三方產品 你必須在
命令行中使用 classpath 選項或者使用 CLASSPATH 環境變量來確定這些類的位置 我
們在上面所說的用戶自己的類就是特指這些類
這樣 一般來說 用戶只需指定用戶類的位置 引導類和擴展類是 自動 尋找的
當你的程序需要第三方的類庫支持 而且比較常用 就可以采用此種方法比如常
用的數據庫驅動程序 寫 servlet 需要的 servlet 包等等 設置方法就是在環境變量中
加入 CLASSPATH 然後就可以直接編譯運行了而你的程序只用了些基礎類尋找時就用不
著必須設定它
在執行Java程序的時候會自動加載程序用中需要的在rtjar和其他java_home\jre\lib中包含的jar文件中包含的Java基礎類庫和一些擴展類庫這些都是JVM自動處理的對用戶來說是透明的
如果Java程序中使用到了一些應用級別的類(如第三方的類)可以在javac和java中的classpath選項中指定它們的搜索路徑或者是自 己寫ClassLoader加載另外也可以設置ClassPath環境變量在裡面指定那些應用級別的類的搜索路徑
設置ClassPath環境變量不是必須的只是為了方便使用設置了ClassPathJDK就會按ClassPath制定的路徑去搜索需要的應用級別的類而不必每一次都使用classpath選項或自己寫ClassLoader
還有需要注意的就是如果相關的類就在當前工作目錄下的話上面種方法都可以不要因為JDK系統會首先搜索會在當前的工作目錄中搜索程序相關的類 (在jdk下已經驗證)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27125.html