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

蘭亭風雨發表於2014-01-25

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/18547959


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

1.開啟我的電腦--屬性--高階--環境變數 

2.新建環境變數JAVA_HOME 和CLASSPATH 
變數名:JAVA_HOME 
變數值:C:\Program Files\Java\jdk1.7.0
變數名:CLASSPATH 
變數值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

3. 選擇“環境變數”中變數名為“Path”的環境變數,雙擊該變數,把JDK安裝路徑中bin目錄的絕對路徑,新增到Path變數的值中。
變數名:Path 
變數值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

    很多人都知道path變數的含義就是讓系統在任何路徑下都可以識別java、javac、javap等命令,而classpath變數的含義是告訴jvm要使用的class所存放的具體路徑。但這種說法太籠統,下面我們來詳細看下各變數值的含義。

    對於Path變數就不用多說了,因為該變數的bin目錄下存放了各種包裝好的工具,因此將此目錄加入到Path變數中,便可以在命令列方式下讓系統在任何路徑下都可以識別這些工具所對應的命令。

    下面重點看下CLASSPATH變數中的各項變數值的含義:

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


    當然,如果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_HOME%\jre\lib目錄下(如其中的rt.jar、resource.jar),類載入機制一文中也有提到,該目錄下的類(在jar包中)會由Bootstrap ClassLoader自動載入,並通過親委派模型保證了基礎類庫只會被Bootstrap ClassLoader載入,這也就保證了基礎類的唯一性。

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

    

相關文章