JDK(Java Development Kit)是針對Java開發員的產品,是整個Java的核心,包括了Java運行環境JRE、Java工具和Java基礎類庫。Java Runtime Environment(JRE)是運行JAVA程序所必須的環境的集合,包含JVM標准實現及Java核心類庫。JVM是Java Virtual Machine(Java虛擬機)的縮寫,是整個java實現跨平台的最核心的部分,能夠運行以Java語言寫作的軟件程序。
在計算機開發語言的歷史中,從來沒有哪種語言象Java那樣受到如此眾多廠商的支持,有如此多的開發工具。
JDK(Java Development Kit)
JDK是Java開發工具包,是Sun Microsystems針對Java開發員的產品。
JDK中包含JRE,在JDK的安裝目錄下有一個名為jre的目錄,里面有兩個文件夾bin和lib,在這里可以認為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。
JDK是整個JAVA的核心,包括了Java運行環境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,標准版,是我們通常用的一個版本,從JDK 5.0開始,改名為Java SE。
②EE(J2EE),enterprise edition,企業版,使用這種JDK開發J2EE應用程序,從JDK 5.0開始,改名為Java EE。
③ME(J2ME),micro edition,主要用於移動設備、嵌入式設備上的java應用程序,從JDK 5.0開始,改名為Java ME。
Java Runtime Environment(JRE)
是運行基於Java語言編寫的程序所不可缺少的運行環境。也是通過它,Java的開發者才得以將自己開發的程序發布到用戶手中,讓用戶使用。
RE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,這些是運行Java程序的必要組件。
與大家熟知的JDK不同,JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器),只是針對於使用Java程序的用戶。
JVM(java virtual machine)
就是我們常說的java虛擬機,它是整個java實現跨平台的最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執行。
也就是說class並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解釋給本地系統執行。
只有JVM還不能成class的執行,因為在解釋class的時候JVM需要調用解釋所需要的類庫lib,而jre包含lib類庫。
JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。
初學JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先從概念上理解一下吧,JDK(Java Development Kit)簡單理解就是Java開發工具包,JRE(Java Runtime Enviroment)是Java的運行環境,JVM( java virtual machine)也就是常常聽到Java虛擬機。JDK是面向開發者的,JRE是面向使用JAVA程序的用戶,上面只是簡單的區別,一般網上好多都講概念,我就不講了,直接截圖應該會更清晰一點,我安裝的JDK1.8,效果如圖:
JDK和JRE
通過上圖發現發現有兩個JRE文件夾,如果細看里面的內容基本上是一樣的,如果是只是Java程序使用者,那么只會有最外層的那個JRE目錄,JDK中是JRE自帶的,你如果安裝了JDK必然里面會有一個JRE.那么問題來了,為什么會有兩套JRE呢?
最開始使用JAVA的時候設置JAVA環境變量的時候除了設置JAVA_Home中JDK的路徑之外,還會需要設ClassPath,%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;dt.jar和tools.jar是兩個java最基本的包,里面包含了從java最重要的lang包到各種高級功能如可視化的swing包,是java必不可少的。而path下面的bin里面都是java的可執行的編譯器及其工具,如java,javadoc等,你在任意的文件夾下面運行cmd鍵入javac,系統就能自動召見java的編譯器就是歸功於這個環境變量的設置 ;如果修改其中tools.jar的名字,cmd運行的時候會報錯:
報錯的原因就是輸入的javac的命令不是去JDK中bin目錄去找的javac.exe,而是去JDK中lib目錄中的tools.jar中com.sun.tools.javac.Main中執行,因此javac.exe只是一個包裝器(Wrapper),存在的目的是為了讓開發者免於輸入過長的指命。這個時候發現JDK里的工具幾乎是用Java所編寫,同屬於Java應用程序,因此要使用JDK所附的工具來開發Java程序,所以自身需要附一套JRE才能運行。上圖中與jdk同級目錄下的JRE就是用來運行一般Java程序用的。
兩套JRE運行的時候究竟運行哪一個呢,這個時候JDK中java.exe先從自身目錄中找,然后父級目錄中找,如果都沒有就去注冊表中找:
所以java.exe的運行結果與你的電腦里面哪個JRE被執行有很大的關系,JDK和JRE應該算是說完了,下面說說JRE和JVM.
JRE和JVM
JVM -- java virtual machineJVM就是我們常說的java虛擬機,它是整個java實現跨平台的最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執行,class文件並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解釋給本地系統執行,類似於C#中的CLR。
JVM不能單獨搞定class的執行,解釋class的時候JVM需要調用解釋所需要的類庫lib。在JDK下面的的jre目錄里面有兩個文件夾bin和lib,在這里可以認為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。JVM+Lib=JRE,如果講的具體點就是bin目錄下的jvm.dll文件, jvm.dll無法單獨工作,當jvm.dll啟動后,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態鏈接庫),而這些輔助用的動態鏈接庫(.dll)都必須位 於jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄下的jvm.dll。
JDK在目前為止還是模糊的概念,這個時候可以通過JDK的目錄文件來看下:
在目錄下面有五個文件夾、一個src類庫源碼壓縮包和幾個聲明文件,其他五個文件夾分別是:bin、db、include、lib、 jre,db這個文件看業務需求~
bin:最主要的是編譯器(javac.exe);
db:jdk從1.6之后內置了Derby數據庫,它是是一個純用Java實現的內存數據庫,屬於Apache的一個開源項目。用Java實現的,所以可以在任何平台上運行;另外一個特點是體積小,免安裝,只需要幾個小jar包就可以運行了。
include:java和JVM交互用的頭文件;
lib:常用類庫
jre:java運行環境
JDK包含JRE,而JRE包含JVM,總的來說JDK是用於java程序的開發,而jre則是只能運行class而沒有編譯的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時只需選中jre路徑就ok了,最后用張網絡圖片總結下吧: