JDK和JRE有什麼區別? java
它們的做用是什麼,什麼時候應使用其中一個? shell
JRE是Java運行時環境 。 它是運行已編譯的Java程序所需的全部程序的包,包括Java虛擬機(JVM),Java類庫, java
命令和其餘基礎結構。 可是,它不能用於建立新程序。 編程
JDK是Java Development Kit ,這是Java的全功能SDK。 它具備JRE擁有的全部內容,還具備編譯器( javac
)和工具(如javadoc
和jdb
)。 它可以建立和編譯程序。 小程序
一般,若是隻關心在計算機上運行Java程序,則只會安裝JRE。 這就是您所須要的。 另外一方面,若是您打算進行一些Java編程,則須要安裝JDK。 服務器
有時,即便您不打算在計算機上進行任何Java開發,也仍然須要安裝JDK。 例如,若是要使用JSP部署Web應用程序,則從技術上講,您只是在應用程序服務器內部運行Java程序。 那爲何還要JDK呢? 由於應用服務器會將JSP轉換爲Java servlet,而且須要使用JDK來編譯servlet。 我相信還有更多的例子。 oracle
上面的答案(巴勃羅)是正確的。 這只是附加信息。 app
顧名思義, JRE是一個環境 。 基本上,這是一堆包含Java相關文件的目錄,例如: 編程語言
bin/
包含Java的可執行程序。 最重要的是java
(對於Windows,也包括javaw
),它將啓動JVM。 這裏還有一些其餘實用程序,例如keytool
和policytool
。 conf/
擁有用戶可編輯的配置文件,供Java專家使用。 lib/
具備大量的支持文件:一些.jar
,配置文件,屬性文件,字體,翻譯,證書等–全部Java的「修整」。 最重要的是modules
,該文件包含Java標準庫的.class
文件。 bin/
或lib/
下包含一些.dll
(Windows)或.dylib
(macOS)或.so
(Linux)文件,並帶有特定於系統的支持本機二進制代碼。 JDK也是一組目錄。 它是JRE的超集,其中有一些補充: 函數
bin/
已使用開發工具進行了擴展。 其中最重要的是javac
; 其餘包括jar
, javadoc
和jshell
。 jmods/
,其中包含標準庫的JMOD文件。 這些文件容許標準庫與jlink
一塊兒使用。 從Java官方網站... 工具
JRE(Java運行時環境):
JDK(Java開發套件)
從調試的角度來看,有一個區別:
要調試Java系統類(例如String和ArrayList),您須要使用「調試信息」編譯的特殊版本的JRE。 JDK中包含的JRE提供了此信息,但常規JRE沒有提供。 常規JRE不包含此信息以確保更好的性能。
什麼是調試信息? 這是此博客文章的簡要說明:
現代的編譯器將其高級代碼縮進和嵌套的控制結構以及任意類型的變量轉換爲一大堆稱爲機器代碼(在Java中爲字節碼)的位,就能夠很好地轉換您的高級代碼。在目標CPU(JVM的虛擬CPU)上儘量快地運行。 Java代碼被轉換爲多個機器代碼指令。 變量處處都是-放入堆棧,寄存器或徹底優化。 結構和對象甚至不存在於生成的代碼中–它們只是一種抽象,能夠轉換爲硬編碼的偏移量到內存緩衝區中。
那麼,當您要求調試器在某個函數的入口處中斷時,調試器如何知道在何處中止? 當您詢問變量值時,如何設法找到要顯示的內容? 答案是–調試信息。
調試信息由編譯器與機器代碼一塊兒生成。 它表示可執行程序和原始源代碼之間的關係。 該信息被編碼爲預約義的格式,並與機器代碼一塊兒存儲。 多年來,針對不一樣的平臺和可執行文件發明了許多此類格式。
JDK是JRE的超集,包含JRE中的全部內容,以及開發applet和應用程序所需的工具,例如編譯器和調試器。 JRE提供了庫,Java虛擬機(JVM)和其餘組件,以運行用Java編程語言編寫的小程序和應用程序。