一、JDK和JRE的區別
1 、JDK中,各個文件目錄的作用:
- bin目錄:存放JDK用於開發的一些終端命令工具。 常見的工具如:“javac”的作用是將java源文件編譯為class文件(即字解碼文件); “java”命令的作用是運行class文件。
- db目錄:是java開發的一個開源的關系型數據庫;
- include目錄:是一些C語言的頭文件;
- jre目錄:JDK所依賴的java運行時;
- lib目錄:存放JDK開發工具所依賴的一些庫文件;
- man目錄:存放JDK開發工具的說明文檔。
2、JDK和JRE的區別
- JDK是java開發核心組件,是用來編譯解釋java程序的核心組件,包含java compile(javac) 面向的是java開發人員。
- JRE是java運行環境,用來支持java程序的運行,主要包含的是JVM,面向的是java程序。Java是一種跨平台語言,一次編譯,多次在多台電腦上運行,這種機制主要依靠JVM實現。java程序編譯得到的是中間字節碼,中間字節碼是不能再機器上直接運行的,必須要經過JVM把中間字節碼轉換為機器語言。
- 在開發過程中配置環境變量時,PATH和CLASSPATH的配置都是針對JDK的,可以配置為:
JAVA_HOME=“JDK安裝的根目錄"
PATH=“.;%JAVA_HOME%/bin" CLASSPATH=".;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar"
二、PATH和CLASSPATH的區別
- PATH是操作系統所有可執行程序的路徑;
- classpath變量的含義是告訴jvm要使用或執行的class放在什么路徑上,便於JVM加載class文件,
- path是系統用來指定可執行文件的完整路徑,即使不在path中設置JDK的路徑也可執行Java文件,但必須把完整的路徑寫出來,如C:\Java\jdk1.7\bin\javac HelloWorld.java。path是用來搜索所執行的可執行文件路徑的,如果執行的可執行文件不在當前目錄下,那就會依次搜索path中設置的路徑;而java的各種操作命令是在其安裝路徑中的bin目錄下。所以在path中設置了JDK的安裝目錄后就不用再把java文件的完整路徑寫出來了,它會自動去path中設置的路徑中去找;
- classpath是指定你在程序中所使用的類(.class)文件所在的位置,就如在引入一個類時:import javax.swing.JTable這句話是告訴編譯器要引入javax.swing這個包下的JTable類,而classpath就是告訴編譯器該到哪里去找到這個類(前提是你在classpath中設置了這個類的路徑)。如果你想要編譯在當前目錄下找,就加上“.”,如:.;C:\Java\jdk1.7\,這樣編譯器就會到當前目錄和C:\Java\jdk1.7\去找javax.swing.JTable這個類;還提下:大多數人都是用Eclipse寫程序,不設classpath也沒關系,因為Eclipse有相關的配置;
三、CLASSPATH中配置的tools.jar和dt.jar的作用
1、tools.jar、dt.jar的作用
- tools.jar是關於一些JDK工具的類庫,它跟我們程序中用到的基礎類庫(java.*、javax.*)沒有關系。tools.jar主要是為jdk的工具,包括javac,java,javadoc,javap等工具,提供所要用到的類庫。用壓縮軟件打開tools.jar,你會發現有很多文件是和bin目錄下的exe工具相對性的,如下圖:(javap:java printer的縮寫,是jdk自帶的一個反編譯工具)

- dt.jar就是DesignTime Archive的縮寫,首先看一下SUN對於dt.jar的定義:Also includes dt.jar, the DesignTime archive of BeanInfo files that tell interactive development environments (IDE's) how to display the Java components and how to let the developer customize them for the application。其實dt.jar里面主要是swing組件的BeanInfo。IDE根據這些BeanInfo顯示這些組件以及開發人員如何定制他們。
2、tools.jar和基礎類庫的區別
- 在配置環境變量時,你會發現JAVA_HOME、PATH、CLASSPATH這三個變量居然沒有基本類庫(指所有的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也會自動到該目錄下找擴展類,而不需要我們指定。
本博客部分內容轉載自CSDN
作者:蘭亭風雨 原文:https://blog.csdn.net/ns_code/article/details/18547959