天天看點

classpath環境變量的作用_詳細說明JDK環境變量中dt.jar、tools.jar等變量值的作用(結合ClassLoader)...

學習Java的人都要經曆配置JDK環境變量這一步,安裝好JDK後,我們一般會做如下配置:

1.

打開我的電腦--屬性--進階--環境變量

2.建立

環境變量

JAVA_HOME

CLASSPATH

變量名:JAVA_HOME

變量值:C:Program FilesJavajdk1.7.0

變量名:CLASSPATH

變量值:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;

注意

:一.路徑要是自己安裝jdk的對應路徑,筆者這兒是C:Program FilesJavajdk1.7.0。

二.JDK1.5以上的版本可以不用設定classpath環境變量,因為在該路徑中".;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar",首先jdk1.5及其以上版本時:“.”表示的目前路徑尋找已經實作了自動搜尋。其次“%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar”中的編譯和運作工具也實作了自動加載。

3

.

選擇

“環境變量”中變量名為“

Path

”的環境變量,輕按兩下該變量,把JDK安裝路徑中bin目錄的絕對路徑,

添加

到Path變量的值中。

變量名:Path

變量值:%JAVA_HOME%bin;%JAVA_HOME%jrebin;

很多人都知道

path變量的含義就是讓系統在任何路徑下都可以識别java、javac、javap

等指令,而

classpath變量的含義是告訴jvm要使用的class所存放的具體路徑

。但這種說法太籠統,下面我們來詳細看下各變量值的含義。

  1. 對于Path變量就不用多說了,因為該變量的bin目錄下存放了各種包裝好的工具,是以将此目錄加入到Path變量中,便可以在指令行方式下讓系統在任何路徑下都可以識别這些工具所對應的指令。

2. 下面重點看下CLASSPATH變量中的各項變量值的含義:

tools.jar:工具類庫,它跟我們程式中用到的基礎類庫沒有關系。我們注意到在Path中變量值bin目錄下的各個exe工具的大小都很小,一般都在27KB左右,這是因為它們實際上僅僅相當于是一層代碼的包裝,這些工具的實作所要用到的類庫都在tools.jar中,用壓縮軟體打開tools.jar,你會發現有很多檔案是和bin目錄下的exe工具相對性的,如下圖:

classpath環境變量的作用_詳細說明JDK環境變量中dt.jar、tools.jar等變量值的作用(結合ClassLoader)...

當然,如果tools.jar的功能隻有這些的話,那麼我們根本不用把它加入到CLASSPATH變量中,因為bin目錄下的工具自己可以完成對這些類庫的調用,是以tools.jar應該還有其他的功能。在裡面還可以看到有Applet和RMI等相關的檔案,是以tools.jar應該還是遠端調用等必須的jar包。tools.jar的其他作用,我沒有具體深入去研究,有朋友了解的話,可以在這篇文章下直接留言給我。

dt.jar:運作環境類庫,主要是Swing包,這一點通過用壓縮軟體打開dt.jar也可以看到。如果在開發時候沒有用到Swing包,那麼可以不用将dt.jar添加到CLASSPATH變量中。

目前目錄:CLASSPATH變量中的“.”便代表目前目錄,即類加載器會從Java源代碼所在的目錄中去尋找Class檔案。

介紹完這三個環境變量後,你會發現,居然沒有基本類庫(指所有的Java.*開頭的類)和擴充類庫(如javax.*開頭的類),也就是我們程式中import的那些東東所在的jar包。如果讀過我前面的類加載機制一文,你應該會注意到,CLASSPATH中的這些類都是由Application ClassLoader或者我們自定義的

類加載器

來加載的,這裡當然不能包括基礎類庫,如果包括基礎類庫的話,并用兩個不同的自定義類加載器去加載該基礎類,那它得到的該基礎類就不是唯一的了,這樣便不能保證Java類的安全性。

實際上,這些基礎類庫(指所有的Java.*開頭的類)都在%JAVA_HOME%jrelib目錄下(如其中的rt.jar、resource.jar),類加載機制一文中也有提到,該目錄下的類(在jar包中)會由Bootstrap ClassLoader自動加載,并通過親委派模型保證了基礎類庫隻會被Bootstrap ClassLoader加載,這也就保證了基礎類的唯一性。也

避免了黑客的同名類庫攻擊

(java.lang.string在用BootStrap加載之前就曾經因為App.ClassLoader(加載一般線程中的類的加載器)加載過程被黑客利用格式化代碼僞裝成類清空磁盤)

另外,擴充類庫在%JAVA_HOME%jrelibext目錄下,該目錄下的類是由Extension ClassLoader來加載的,有時候我們也要import這裡面的類,但是并沒有基礎類庫用的頻繁。同樣,Extension ClassLoader也會自動到該目錄下找擴充類,而不需要我們指定。

---------------------