JDK(Java Development Kit)是針對Java開發員的產品,是整個Java的核心,包括了Java運行環境JRE、Java工具和Java基礎類庫。Java Runtime Environment(JRE)是運行JAVA程序所必須的環境的集合,包含JVM標准實現及Java核心類庫。JVM是Java Virtual Machine(Java虛擬機)的縮寫,是整個java實現跨平台的最核心的部分,能夠運行以Java語言寫作的軟件程序。
1. 定義
JRE(Java Runtime Enviroment)是Java的運行環境。 面向Java程序的使用者,而不是開發者。如果你僅下載並安裝了JRE,那么你的系統只能運行Java程序。JRE是運行Java程序所必須環境的集合, 包含JVM標准實現及 Java核心類庫。它包括Java虛擬機、Java平台核心類和支持文件。它不包含開發工具(編譯器、調試器等)。
JDK(Java Development Kit)又稱J2SDK(Java2 Software Development Kit),是Java開發工具包,它提供了Java的開發環境(提供了編譯器javac等工具,用於將java文件編譯為class文件)和運行環境(提 供了JVM和Runtime輔助包,用於解析class文件使其得到運行)。如果你下載並安裝了JDK,那么你不僅可以開發Java程序,也同時擁有了運 行Java程序的平台。JDK是整個Java的核心,包括了Java運行環境(JRE),一堆Java工具tools.jar和Java標准類庫 (rt.jar)。
2. 區別
JRE主要包含:java類庫的class文件(都在lib目錄下打包成了jar)和虛擬機(jvm.dll);JDK主要包含:java類庫的 class文件(都在lib目錄下打包成了jar)並自帶一個JRE。那么為什么JDK要自帶一個JRE呢?而且jdk/jre/bin下的client 和server兩個文件夾下都包含jvm.dll(說明JDK自帶的JRE有兩個虛擬機)。
記得在環境變量path中設置jdk/bin路徑麽?老師會告訴大家不設置的話javac和java是用不了的。確實jdk/bin目錄下包含了所 有的命令。可是有沒有人想過我們用的java命令並不是jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做一個實驗,大家可以把jdk /bin目錄下的java.exe剪切到別的地方再運行java程序,發現了什么?一切OK!(JRE中沒有javac命令,原因很簡單,它不是開發環 境)那么有人會問了?我明明沒有設置jre/bin目錄到環境變量中啊?試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需 要jre能讓java程序跑起來就可以了,那么每個客戶還需要手動去設置環境變量多麻煩啊?所以安裝jre的時候安裝程序自動幫你把jre的 java.exe添加到了系統變量中,驗證的方法很簡單,去Windows/system32下面去看看吧,發現了什么?有一個java.exe。
3. 難點
如果安裝了JDK,你的電腦就有兩套JRE(JRE本身和JDK中的JRE),前面這套比后面那套少了Server端的Java虛擬機。
(1)為什么Sun要讓JDK安裝兩套相同的JRE?這是因為JDK里面有很多用Java所編寫的開發工具(如javac.exe、jar.exe 等),而且都放置在/lib/tools.jar里。如果我們將tools.jar改名為tools1.jar,然后運行javac.exe,顯示如下結 果:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/Main。這個意思是說,你輸入javac.exe與輸入java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main 是一樣的,會得到相同的結果。從這里我們可以證明javac.exe只是一個包裝器(Wrapper),而制作的目的是為了讓開發者免於輸入太長的指命。 而且可以發現/lib目錄下的程序都很小,不大於29K,從這里我們可以得出一個結論。就是JDK里的工具幾乎是用Java所編寫,所以也是Java應用 程序,因此要使用JDK所附的工具來開發Java程序,也必須要自行附一套JRE才行,所以位於JDK目錄下的那套JRE就是用來運行一般Java程序 的。
(2)如果一台電腦安裝兩套以上的JRE,誰來決定呢?這個重大任務就落在java.exe身上。java.exe的工作就是找到合適的JRE來運 行Java程序。java.exe依照以下的順序來查找JRE:1)自己的目錄下有沒有JRE;2)父目錄有沒有JRE;3)查詢注冊表: [HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment]。所以java.exe的運行結果與你的電腦里面哪個JRE被執行有很大的關系。
(3)JDK-->JRE-->Bin目錄下有兩個文件夾:server與client,這是真正的jvm.dll所在。 jvm.dll無法單獨工作,當jvm.dll啟動后,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態鏈接庫),而這些輔助用的動態鏈接庫(.dll)都必須位 於jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄下的jvm.dll。
4. 最主流的JDK是Sun公司發布的JDK,除了Sun之外,還有很多公司和組織都開發了自己的JDK,例如IBM公司開發的JDK,BEA公司的Jrocket,還有GNU組織開發的JDK等等。
多個JDK版本共存
背景:
JDK 都已經發布到1.8版本了,作為一個“懷舊”的programer,我對新版本一直沒什么關注。一直都是項目需要哪個版本就用哪個版本JDK,而且我一直 認為如果項目太過於依賴JDK版本的話,那開發和設計上太shit了!這幾天由於一些原因需要切換到老版本的項目去做些東西。老版本(稱為V1)使用的是 JDK1.6開發的,新版本(稱為V2)使用的是JDK1.7。現在需要兩個版本的JDK共存,本以為很簡單的事情,結果出了一堆問題。囧
問題:
1.安裝了JDK1.6,copy了eclipse,get了項目代碼,但是公司的eclipse插件無法運行!
2.指定了Eclipse啟動時使用的JDK為1.6,報錯code 13,無法啟動Eclipse!
3.解決了Eclipse啟動問題和插件問題,分別為項目(兩個工作空間)指定了JDK版本,但是1.7版本的無法運行,會顯示“找不到或無法加載主類錯誤”!
本來這個事件是很簡單的,但是由於一些小的細節失誤才導致自己繞了老大一個圈子。看來細節決定成敗在哪兒都適用!
總結:
1. JDK在大版本上是允許同時存在的,但是小版本上是不允許的;
2. Eclipse本身是一個Java程序,這我們都知道,但是Eclipse啟動的時候為什么找不到一個javaw進程呢?那是因為Eclipse默認調用的是jvm.dll,如果我們指定啟動參數是javaw.exe那么會啟動一個javaw.exe進程。
3.Eclipse 也會依賴一定版本的JDK,這要看你用哪個版本的Eclipse,一般來說它是向后兼容的,也就是JDK1.5能運行,JDK1.6、JDK1.7也可 以。但是不保證Eclipse的插件在不同版本的JDK上也能良好運行,比如我們公司的插件,對JDK版本依賴就很強。
4.Eclipse可以指定編譯、運行Java程序的JDK版本,這個JDK版本和它本身運行時的JDK是不一樣的,或者說兩者毫無關系,可以是同一個JDK。
5.Eclipse分32位和64位,必須配合32位和64位JDK,否則會報錯!
我們有時候會在windows下安裝多個jdk,但是安裝多個jdk會引起一些問題。
本機是安裝了兩個版本的jdk,一個是jdk1.8和jdk1.6。一開始是安裝的jdk1.8,但是由於jdk1.8在項目中會有一些錯誤,所以決定還是使用jdk1.6吧。但是安裝好1.6后,也配置好了環境變量。問題出現了,執行Java – version 得到

我認為是我配置jdk1.6時候把1.6版本的目錄放在了1.8后面,我就去查找我的Path(這個時候我的JAVA_HOME=C:\Java1.6\jdk1.6.0_24)
C:\ProgramData\Oracle\Java\javapath;%JAVA_HOME%\bin;E:\app\Administrator\product\11.2.0\dbhome_1\BIN……
在安裝JDK1.8時(本機先安裝jdk1.8再安裝的jdk1.6),自動將java.exe、javaw.exe、javaws.exe三個可執行文件 復制到了C:\Windows\System32目錄,由於這個目錄在WINDOWS環境變量中的優先級高於JAVA_HOME設置的環境變量優先級
解決方案:將C:\Windows\System32目錄下的java.exe,javaw.exe,javaws.exe刪除即可。開啟新的命令行窗口,再執行java -version時,就得到了期望中的結果。
我去查看自己的C:\Windows\System32去查找,但是我的竟然沒有,但是他給了我一個思路。我的Path是:
C:\ProgramData\oracle\Java\javapath;%JAVA_HOME%\bin;E:\app\Administrator\product\11.2.0\dbhome_1\BIN……
我就去最前面的路徑去找,啊,C:\ProgramData\Oracle\Java\javapath下竟然有這三個文件(我的電腦上安裝了oracle):

最后我把%JAVA_HOME%\bin放到了最前面,再次執行java – version。問題解決了:

建議:為了提高效率,把你想使用的JDK的bin路徑直接放到Path的最前面。
