jdk中集成的jre和單獨安裝的jre有什么區別?


jdk 和 jre 是什么? 有什么區別?

  • jre
    Jre 是java runtime environment, 是java程序的運行環境。既然是運行,當然要包含jvm,也就是大家熟悉的虛擬機啦,還有所有java類庫的class文件,都在lib目錄下打包成了jar。大家可以自己驗證。至於在windows上的虛擬機是哪個文件呢?學過MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一個jvm.dll呢?那就是虛擬機。

  • jdk
    Jdk 是java development kit,是java的開發工具包, 主要是給ide 用的,里面包含了各種類庫和工具。當然也包括了另外一個Jre., 而且jdk/jre/bin 里面也有一個server文件夾, server文件夾下面也有一個jvm.dll 虛擬機。

為什么默認安裝的情況下, 有兩個jre呢

我們做了以下幾個小實驗:

1. 對比文件夾內容

使用 winMerge 軟件對兩個jre 文件夾進行對比(\(JAVA_HOME\)\jdk1.8\jre\ 和 \(JAVA_HOME\)\jre1.8\), 結果如下:

可以看到,兩個文件夾中的文件結構和命名絕大部分是相同的,可以推斷這兩個jre 文件夾是可以相互替換的。故在功能上,其實是可以相互替換的。

2. 在命令行環境下(模擬用戶使用)

使用javac 命令 編譯一個 Test.class 輸出 hello world 的。(為什么不用考慮javac? 因為javac 不是jre 中的, 不在討論范圍內):
\(JAVA_HOME\)\jdk1.8\jre\ 這個文件夾剪切到其它的地方,命令行輸入java Test, 輸出正常:

\(JAVA_HOME\)\jre1.8\ 這個文件夾剪切到其它的地方,命令行輸入java Test, 輸出錯誤:

說明命令行這種用戶使用場景下,JVM是\(JAVA_HOME\)\jre1.8\ 里面的虛擬機環境。

那有人可能要問了, 自己明明沒有將\(JAVA_HOME\)\jre1.8\ 加到環境變量里面去, 為什么會使用這里面的JVM?
我們看到
原因是:在安裝jre 的時候,安裝程序自動在\(System32\)\java\ (我的電腦里面是C:\Program Files (x86)\Common Files\Oracle\Java\javapath) 路徑加到Path 的最上面, 在\(JAVA_HOME\)\jdk1.8\bin\前面, 而且在以上目錄下有java.exe 文件,這個文件應該是一個wrapper, 而目的是為了讓使用者免於輸入太長的指命。Java.exe的工作就是找到合適的JRE來運行Java程序。 Java.exe依照底下的順序來查找JRE:自己的目錄下有沒有JRE;父目錄有沒有JRE;查詢注冊表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] , 查詢注冊表之后,發現以上鍵值 是和\(JAVA_HOME\)\jre1.8\一致的。

說明在用戶級別使用java虛擬機去運行jar 等程序時, 默認使用過的是單獨安裝的jre, 即\(JAVA_HOME\)\jre1.8\

3. Intellij 使用環境下 (模擬一般IDE 開發使用)

\(JAVA_HOME\)\jdk1.8\jre (即jdk集成的jre) 文件夾剪切到其它地方之后,用Intellij 打開之前一切正常的工程,發現

報錯 Cannot resolve symbol 'Stack'

\(JAVA_HOME\)\jre1.8\ 移除, 保留\(JAVA_HOME\)jdk1.8\jre\ 則 IDE 一切正常。、

這說明 想Intellij 這樣的開發環境下,對代碼的糾錯,預運行等需要使用 \(JAVA_HOME\)\jdk1.8\jre\ 這樣jdk 中集成的jre

綜述

根據以上的小實驗結果,我們有理由相信:

  • \(JAVA_HOME\)\jre1.8\ 這樣單獨安裝的jre 是給普通用戶,和其它大多數的一般應用程序使用的java運行環境。
  • \(JAVA_HOME\)\jdk1.8\jre\ 這樣集成在jdk 中的jre 是給IDE 開發環境使用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM