jre 是j**a runtime environment, 是j**a程式的執行環境。既然是執行,當然要包含jvm,也就是大家熟悉的虛擬機器啦,還有所有j**a類庫的class檔案,都在lib目錄下打包成了jar。大家可以自己驗證。至於在windows上的虛擬機器是哪個檔案呢?學過mfc的都知道什麼是dll檔案吧,那麼大家看看jre/bin/client裡面是不是有乙個jvm.dll呢?那就是虛擬機器。
jdk 是j**a development kit,是j**a的開發工具包,裡面包含了各種類庫和工具。當然也包括了另外乙個jre. 那麼為什麼要包括另外乙個jre呢?而且jdk/jre/bin同時有client和server兩個資料夾下都包含乙個jvm.dll。說明是有兩個虛擬機器的。這一點不知道大家是否注意到了呢?
相信大家都知道jdk的bin下有各種j**a程式需要用到的命令,與jre的bin目錄最明顯的區別就是jdk下才有j**ac,這一點很好理解,因為 jre只是乙個執行環境而已。與開發無關,正因為如此,具備開發功能的jdk自己的jre下才會同時有client性質的jvm和server性質的 jvm, 而僅僅作為執行環境的jre下只需要client性質的jvm.dll就夠了。
記得在環境變數path中設定jdk/bin路徑麼?這應該是大家學習j**a的第一步吧,老師會告訴大家不設定的話j**ac和j**a是用不了的。確實jdk/bin目錄下包含了所有的命令。可是有沒有人想過我們用的j**a命令並不是 jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做乙個實驗,大家可以把jdk/bin目錄下的j**a.exe剪下到別的地方再執行 j**a程式,發現了什麼?一切ok!
那麼有人會問了?我明明沒有設定jre/bin目錄到環境變數中啊?
試想一下如果j**a為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓j**a程式跑起來就可以了,那麼每個客戶還需要手動去設定環境變數多麻煩啊?所以安裝jre的時候安裝程式自動幫你把jre的j**a.exe新增到了系統變數中,驗證的方法很簡單,大家看到了系統環境變數的 path最前面有「%systemroot%system32;%systemroot%;」這樣的配置,那麼再去windows/system32下面去看看吧,發現了什麼?有乙個j**a.exe。
如果強行能夠把jdk/bin挪到system32變數前面,當然也可以迫使使用jdk/jre裡面的j**a,不過除非有必要,我不建議大家這麼做。使用單獨的jre跑j**a程式也算是客戶環境下的一種測試。
———————————————————————————————————————————
通俗點來說: jdk是j**a的開發包,其中包括jre;jre僅僅是j**a的執行時環境;而jdk包括了同版本的jre,此外還包括有編譯器和其它工具
jdk是j**a開發工具包(j**a development kit)的縮寫。它是一種構建在j**a平台上發布的應用程式、apple和元件的開發環境。jdk是一切j**a應用程式的基礎,所有的j**a應用程式是構建在這個之上的。它是一組api,也可以說是一些j**a class。要成為乙個j**a程式設計師,jdk是必不可少的最基本的工具。
jre是j**a執行環境(j**a runtime enviroment)的縮寫。它基本上就和j**a虛擬機器是同乙個概念。一般來說,在談論乙個具體的產品的時候,可以說「jre」,而說到理論中的乙個模型的時候,我們常用的是「j**a虛擬機器」。要使用j**a程式,jre是必不可少的環境。
1、為什麼sun要讓jdk安裝兩套相同的jre?
這是因為jdk裡面有很多用j**a所編寫的開發工具(如j**ac.exe、jar.exe等),而且都放置在 \lib\tools.jar 裡。從下面例子可以看出,先將tools.jar改名為tools1.jar,然後執行j**ac.exe,顯示如下結果: exception in thread "main" j**a.lang.noclassdeffounderror: com/sun/tools/j**ac /main 這個意思是說,你輸入j**ac.exe與輸入 j**a -cp c:\jdk\lib\tools.jar com.sun.tools.j**ac.main 是一樣的,會得到相同的結果。從這裡我們可以證明j**ac.exe只是乙個包裝器(wrapper),而製作的目的是為了讓開發者免於輸入太長的指命。而且可以發現\lib目錄下的程式都很小,不大於2 9k,從這裡我們可以得出乙個結論。就是jdk裡的工具幾乎是用j**a所編寫,所以也是j**a應用程式,因此要使用jdk所附的工具來開發j**a程式,也必須要自行附一套jre才行,所以位於c:\program files\j**a目錄下的那套jre就是用來執行一般j**a程式用的。
2、如果一台電腦安裝兩套以上的jre,誰來決定呢?
這個重大任務就落在j**a.exe身上。j**a.exe的工作就是找到合適的jre來執行j**a程式。 j**a.exe依照底下的順序來查詢jre:自己的目錄下有沒有jre;父目錄有沒有jre;查詢登錄檔: [hkey_local_machine\software\j**asoft\j**a runtime environment] 所以j**a.exe的執行結果與你的電腦裡面哪個jre被執行有很大的關係。
add:(小小結)
1.jvm -- j**a virtual machinejvm就是我們常說的j**a虛擬機器,它是整個j**a實現跨平台的最核心的部分,所有的j**a程式會首先被編譯為.class的類檔案,這種類檔案可以在虛擬機器上執行,也就是說class並不直接與機器的作業系統相對應,而是經過虛擬機器間接與作業系統互動,由虛擬機器將程式解釋給本地系統執行。2.jre -- j**a runtime environmentjre是指j**a執行環境。光有jvm還不能成class的執行,因為在解釋class的時候jvm需要呼叫解釋所需要的類庫lib。在jdk的安裝目錄裡你可以找到jre目錄,裡面有兩個資料夾bin和lib,在這裡可以認為bin裡的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。所以,在你寫完j**a程式編譯成.class之後,你可以把這個.class檔案和jre一起打包發給朋友,這樣你的朋友就可以執行你寫程式了。(jre裡有執行.class的j**a.exe)3.jdk -- j**a development kitjdk是j**a開發工具包,基本上每個學j**a的人都會先在機器上裝乙個jdk,那他都包含哪幾部分呢?讓我們看一下jdk的安裝目錄。在目錄下面有六個資料夾、乙個src類庫原始碼壓縮包、和其他幾個宣告檔案。其中,真正在執行j**a時起作用的是以下四個資料夾:bin、include、lib、 jre。現在我們可以看出這樣乙個關係,jdk包含jre,而jre包含jvm。bin:最主要的是編譯器(j**ac.exe)include:j**a和jvm互動用的標頭檔案lib:類庫jre:j**a執行環境(注意:這裡的bin、lib資料夾和jre裡的bin、lib是不同的)總的來說jdk是用於j**a程式的開發,而jre則是只能執行class而沒有編譯的功能。
eclipse、idea等其他ide有自己的編譯器而不是用jdk bin目錄中自帶的,所以在安裝時你會發現他們只要求你選中jre路徑就ok了。
JDK及JRE中bin工具說明
jre bin 工具說明 j ac j a編譯器,將j a源 換成位元組代 j a j a直譯器,直接從類檔案執行j a應用程式 j adoc 根據j a源 及其說明語句生成的html文件 jdb j a偵錯程式,可以逐行地執行程式 設定斷點和檢查變數 j ah 產生可以呼叫j a過程的c過程,或建...
Eclipse中怎麼將JRE換成JDK?
jre顧名思義是j a執行時環境,包含了j a虛擬機器,j a基礎類庫。是使用j a語言編寫的程式執行所需要的軟體環境,是提供給想執行j a程式的使用者使用的。jdk顧名思義是j a開發工具包,是程式設計師使用j a語言編寫j a程式所需的開發工具包,是提供給程式設計師使用的。jdk包含了jre,同...
jdk6和jdk7的區別
substring jdk6 string是通過字元陣列實現的。在jdk 6 中,string類包含三個成員變數 char value,int offset,int count。他們分別用來儲存真正的字元陣列,陣列的第乙個位置索引以及字串中包含的字元個數。當呼叫substring方法的時候,會建立乙...