一、類加載器與classpath
以下為系統(tǒng)中的三種類加載器,每個類加載器都有自己用來尋找類文件的路徑。其中系統(tǒng)類加載器負(fù)責(zé)加載classpath(用戶類路徑)上指定的類庫,classpath是包含有class文件的目錄、jar包或者是war包
-
啟動類加載器(Bootstrap ClassLoader) 此類加載器負(fù)責(zé)將存放在
<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中的,并且是 虛擬機(jī)識別 的(僅按照文件名識別,如rt.jar,名字不符合的類庫即使放在lib目錄中也不會被加載)類庫加載到虛擬機(jī)內(nèi)存中。啟動類加載器無法被Java程序直接引用,用戶在編寫自定義類加載器時,如果需要把加載請求委派給引導(dǎo)類加載器,直接使用null代替即可。 -
擴(kuò)展類加載器(Extension ClassLoader) 這個類加載器是由
ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將<Java_Home>/lib/ext或者被java.ext.dir系統(tǒng)變量所指定路徑中的所有類庫加載到內(nèi)存中,開發(fā)者可以直接使用擴(kuò)展類加載器。 -
應(yīng)用程序類加載器(Application ClassLoader) 這個類加載器是由
AppClassLoader(sun.misc.Launcher$AppClassLoader)實(shí)現(xiàn)的。由于這個類加載器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般稱為 系統(tǒng)類加載器。它負(fù)責(zé)加載用戶類路徑(ClassPath)上所指定的類庫,開發(fā)者可以直接使用這個類加載器,如果應(yīng)用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中 默認(rèn)的類加載器 。
二、classpath的獲取規(guī)則
- 當(dāng)前路徑"."。
- 系統(tǒng)變量CLASSPATH。
- 命令行設(shè)置的-cp或者-classpath。
- 使用-jar命令設(shè)置的jar包。
其中,四種方式優(yōu)先級逐步提升,也就是
當(dāng)前路徑 < 系統(tǒng)變量CLASSPATH < -cp命令行設(shè)置的路徑 < -jar設(shè)置的路徑
三、如何設(shè)置classpath
- 設(shè)置系統(tǒng)變量
setenv CLASSPATH path1:path2
- 命令行使用-cp設(shè)置
-cp path1:path2...
- -jar命令
-jar xxx.jar
linux下都使用“:”分隔