JDK(Java Development Kit)是針對(duì)Java開發(fā)員的產(chǎn)品,是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境JRE、Java工具和Java基礎(chǔ)類庫(kù)。
JRE Java Runtime Environment(JRE)是運(yùn)行JAVA程序所必須的環(huán)境的集合,包含JVM標(biāo)準(zhǔn)實(shí)現(xiàn)及Java核心類庫(kù)。
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,是整個(gè)java實(shí)現(xiàn)跨平臺(tái)的最核心的部分,能夠運(yùn)行以Java語(yǔ)言寫作的軟件程序。

在計(jì)算機(jī)開發(fā)語(yǔ)言的歷史中,從來(lái)沒(méi)有哪種語(yǔ)言象Java那樣受到如此眾多廠商的支持,有如此多的開發(fā)工具。
JDK(Java Development Kit)
JDK是Java開發(fā)工具包,是Sun Microsystems針對(duì)Java開發(fā)員的產(chǎn)品。
JDK中包含JRE,在JDK的安裝目錄下有一個(gè)名為jre的目錄,里面有兩個(gè)文件夾bin和lib,在這里可以認(rèn)為bin里的就是jvm,lib中則是jvm工作所需要的類庫(kù),而jvm和 lib和起來(lái)就稱為jre。
JDK是整個(gè)JAVA的核心,包括了Java運(yùn)行環(huán)境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基礎(chǔ)的類庫(kù)(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,標(biāo)準(zhǔn)版,是我們通常用的一個(gè)版本,從JDK 5.0開始,改名為Java SE。
②EE(J2EE),enterprise edition,企業(yè)版,使用這種JDK開發(fā)J2EE應(yīng)用程序,從JDK 5.0開始,改名為Java EE。
③ME(J2ME),micro edition,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,從JDK 5.0開始,改名為Java ME。
Java Runtime Environment(JRE)
是運(yùn)行基于Java語(yǔ)言編寫的程序所不可缺少的運(yùn)行環(huán)境。也是通過(guò)它,Java的開發(fā)者才得以將自己開發(fā)的程序發(fā)布到用戶手中,讓用戶使用。
RE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,這些是運(yùn)行Java程序的必要組件。
與大家熟知的JDK不同,JRE是Java運(yùn)行環(huán)境,并不是一個(gè)開發(fā)環(huán)境,所以沒(méi)有包含任何開發(fā)工具(如編譯器和調(diào)試器),只是針對(duì)于使用Java程序的用戶。
JVM(java virtual machine)
就是我們常說(shuō)的java虛擬機(jī),它是整個(gè)java實(shí)現(xiàn)跨平臺(tái)的最核心的部分,所有的java程序會(huì)首先被編譯為.class的類文件,這種類文件可以在虛擬機(jī)上執(zhí)行。
也就是說(shuō)class并不直接與機(jī)器的操作系統(tǒng)相對(duì)應(yīng),而是經(jīng)過(guò)虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系統(tǒng)執(zhí)行。
只有JVM還不能成class的執(zhí)行,因?yàn)樵诮忉宑lass的時(shí)候JVM需要調(diào)用解釋所需要的類庫(kù)lib,而jre包含lib類庫(kù)。
JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。
初學(xué)JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先從概念上理解一下吧,JDK(Java Development Kit)簡(jiǎn)單理解就是Java開發(fā)工具包,JRE(Java Runtime Enviroment)是Java的運(yùn)行環(huán)境,JVM( java virtual machine)也就是常常聽到Java虛擬機(jī)。JDK是面向開發(fā)者的,JRE是面向使用JAVA程序的用戶,上面只是簡(jiǎn)單的區(qū)別,一般網(wǎng)上好多都講概念,我就不講了,直接截圖應(yīng)該會(huì)更清晰一點(diǎn),我安裝的JDK1.8,效果如圖:


JDK和JRE
通過(guò)上圖發(fā)現(xiàn)發(fā)現(xiàn)有兩個(gè)JRE文件夾,如果細(xì)看里面的內(nèi)容基本上是一樣的,如果是只是Java程序使用者,那么只會(huì)有最外層的那個(gè)JRE目錄,JDK中是JRE自帶的,你如果安裝了JDK必然里面會(huì)有一個(gè)JRE.那么問(wèn)題來(lái)了,為什么會(huì)有兩套JRE呢?
最開始使用JAVA的時(shí)候設(shè)置JAVA環(huán)境變量的時(shí)候除了設(shè)置JAVA_Home中JDK的路徑之外,還會(huì)需要設(shè)ClassPath,%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;dt.jar和tools.jar是兩個(gè)java最基本的包,里面包含了從java最重要的lang包到各種高級(jí)功能如可視化的swing包,是java必不可少的。而path下面的bin里面都是java的可執(zhí)行的編譯器及其工具,如java,javadoc等,你在任意的文件夾下面運(yùn)行cmd鍵入javac,系統(tǒng)就能自動(dòng)召見java的編譯器就是歸功于這個(gè)環(huán)境變量的設(shè)置 ;如果修改其中tools.jar的名字,cmd運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò):

報(bào)錯(cuò)的原因就是輸入的javac的命令不是去JDK中bin目錄去找的javac.exe,而是去JDK中l(wèi)ib目錄中的tools.jar中com.sun.tools.javac.Main中執(zhí)行,因此javac.exe只是一個(gè)包裝器(Wrapper),存在的目的是為了讓開發(fā)者免于輸入過(guò)長(zhǎng)的指命。這個(gè)時(shí)候發(fā)現(xiàn)JDK里的工具幾乎是用Java所編寫,同屬于Java應(yīng)用程序,因此要使用JDK所附的工具來(lái)開發(fā)Java程序,所以自身需要附一套JRE才能運(yùn)行。上圖中與jdk同級(jí)目錄下的JRE就是用來(lái)運(yùn)行一般Java程序用的。
兩套JRE運(yùn)行的時(shí)候究竟運(yùn)行哪一個(gè)呢,這個(gè)時(shí)候JDK中java.exe先從自身目錄中找,然后父級(jí)目錄中找,如果都沒(méi)有就去注冊(cè)表中找:

所以java.exe的運(yùn)行結(jié)果與你的電腦里面哪個(gè)JRE被執(zhí)行有很大的關(guān)系,JDK和JRE應(yīng)該算是說(shuō)完了,下面說(shuō)說(shuō)JRE和JVM.
JRE和JVM
JVM -- java virtual machineJVM就是我們常說(shuō)的java虛擬機(jī),它是整個(gè)java實(shí)現(xiàn)跨平臺(tái)的最核心的部分,所有的java程序會(huì)首先被編譯為.class的類文件,這種類文件可以在虛擬機(jī)上執(zhí)行,class文件并不直接與機(jī)器的操作系統(tǒng)相對(duì)應(yīng),而是經(jīng)過(guò)虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系統(tǒng)執(zhí)行,類似于C#中的CLR。
JVM不能單獨(dú)搞定class的執(zhí)行,解釋class的時(shí)候JVM需要調(diào)用解釋所需要的類庫(kù)lib。在JDK下面的的jre目錄里面有兩個(gè)文件夾bin和lib,在這里可以認(rèn)為bin里的就是jvm,lib中則是jvm工作所需要的類庫(kù),而jvm和 lib和起來(lái)就稱為jre。JVM+Lib=JRE,如果講的具體點(diǎn)就是bin目錄下的jvm.dll文件, jvm.dll無(wú)法單獨(dú)工作,當(dāng)jvm.dll啟動(dòng)后,會(huì)使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來(lái)載入輔助用的動(dòng)態(tài)鏈接庫(kù)),而這些輔助用的動(dòng)態(tài)鏈接庫(kù)(.dll)都必須位 于jvm.dll所在目錄的父目錄之中。因此想使用哪個(gè)JVM,只需要設(shè)置PATH,指向JRE所在目錄下的jvm.dll。

JDK在目前為止還是模糊的概念,這個(gè)時(shí)候可以通過(guò)JDK的目錄文件來(lái)看下:

在目錄下面有五個(gè)文件夾、一個(gè)src類庫(kù)源碼壓縮包和幾個(gè)聲明文件,其他五個(gè)文件夾分別是:bin、db、include、lib、 jre,db這個(gè)文件看業(yè)務(wù)需求~
bin:最主要的是編譯器(javac.exe);
db:jdk從1.6之后內(nèi)置了Derby數(shù)據(jù)庫(kù),它是是一個(gè)純用Java實(shí)現(xiàn)的內(nèi)存數(shù)據(jù)庫(kù),屬于Apache的一個(gè)開源項(xiàng)目。用Java實(shí)現(xiàn)的,所以可以在任何平臺(tái)上運(yùn)行;另外一個(gè)特點(diǎn)是體積小,免安裝,只需要幾個(gè)小jar包就可以運(yùn)行了。
include:java和JVM交互用的頭文件;
lib:常用類庫(kù)
jre:java運(yùn)行環(huán)境
JDK包含JRE,而JRE包含JVM,總的來(lái)說(shuō)JDK是用于java程序的開發(fā),而jre則是只能運(yùn)行class而沒(méi)有編譯的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時(shí)只需選中jre路徑就ok了,最后用張網(wǎng)絡(luò)圖片總結(jié)下吧:
