JDK 規範與實作


Java由Sun創造,為了讓對Java興趣的廠商、組織、開發者與使用者參與定義Java未來的功能與特性,Sun公司於1998年組成了JCP(Java Community Process),這是一個開放性國際組織,目的是讓Java演進由Sun非正式地主導,成為全世界數以百計代表成員公開監督的過程。

任何想要提議加入Java的功能或特性,必須以JSR(Java Specification Requests)正式文件的方式提交,JSR必須經過JCP執行委員會(Executive Committee)投票通過,方可成為最終標準文件,有興趣的廠商或組織可以根據JSR實現產品。

若JSR成為最終文件後,必須根據JSR實作出免費且開發原始碼的參考實現,稱為RI(Reference Implementation),並提供TCK(Technology Compatibility Kit)作為技術相容測試工具箱,方便其它想根據JSR實現產品的廠商或組織參考與測試相容性。

現在無論是Java SE、Java EE或Java ME,都是業界共同訂製的標準,每個標準背後代表了業界所面臨的一些問題,他們期待使用Java來解決問題,認為應該有某些元件、特性、應用程式介面等,來解決這些問題,因而製訂JSR作為正式標準規範文件,不同的技術解決方案標準規範會給予一個編號。

在JSR所規範的標準之下,各廠商可以各自實作成品,所以同一份JSR,可以有不同廠商的實作產品,以Java SE為例,對於身為開發人員,或使用Java開發產品的公司而言,只要是使用相容於標準的JDK/JRE開發產品,就可以執行於相容於標準的JRE上,而不用擔心跨平台的問題。

Java SE 8的主要規範是在JSR 337文件之中,而Java SE平台中的特定技術,則再規範於特定的JSR文件之中,若你對這些文件有興趣,可以參考 JSR 337: JavaTM SE 8 Release Contents

在過去,Sun JDK實現,也就是被Oracle收購之後的Oracle JDK 實現,就是JDK的參考實作,有興趣的廠商或組織也可以根據JSR自行實現產品,像是IBM就根據JSR實作了自家的IBM JDK,並且只有通過TCK 相容性測試的實作,才可以使用Java這個商標

2006年的JavaOne大會上,Sun宣告對Java開放原始碼,從JDK7 b10 開始有了OpenJDK,並於2009年4月15日正式發佈 OpenJDK。Oracle時代發佈的JDK7正式版本,指定了OpenJDK7為官方參考實作。

Oracle JDK7與OpenJDK7

與同為開放原始碼的Sun JDK不同的是,Sun JDK採JRL,而 OpenJDK7採GPL(帶有GPL linking exception的修正版本),前者原始碼可用於個人研究使用,但禁止任何商業用途,後者則允許商業上的使用,因此,OpenJDK7必須拿掉許多在兩個授權間有衝突的程式碼,也不包括一些部署(Deployment)工具(像是Java Web Start等 )以及軟體套件(像是Java DB)等;現在你在 Java Platform, Standard Edition 8 Reference Implementations 下載RI時,也會看到有基於GNU General Public License version 2 與 Oracle Binary Code License 兩個授權的版本。

由於OpenJDK7中有許多程式碼因授權衝突而必須拿掉,因此原始的OpenJDK7是不完整的,因此無法通過JCK相容測試,如果執行java -version,原始的OpenJDK7顯示的會是openjdk version字樣,而不是java version字樣

為了解決授權問題,以便在Fedora或Linux分支中能自由發佈OpenJDK7,Red Hat於2007年發起了 IcedTea 計畫,而由於原始的OpenJDK7是不完整的,後來IcedTea致力於修補OpenJDK7使之完備,並通過了JCK相容測試,如果使用IcedTea修補過後的OpenJDK7,執行java -version,就會顯示java version字樣

OpenJDK7與OpenJDK6

在OpenJDK官方網站,也可以看到OpenJDK6的版本,OpenJDK6並不是JDK6的分支,而是將OpenJDK7中JDK7的特性拿掉,使之符合JDK6的規範,因而OpenJDK6實際上是OpenJDK7的分支,OpenJDK6可以通過JCK相容測試。

Oracle從2012年 7 月以來,就打算結束對JDK6的支持,在2013年2月時宣佈JDK6 Update 43時,宣佈這是最後一個免費更新版本(實際上後來還有Update 45),希望大家趕快昇級至JDK7。

由於JDK6在企業間仍廣泛應用,Red Hat於 2013年3月時 宣布持有 OpenJDK6 領導權,以能持續對OpenJDK6發現的臭蟲與安全問題進行修補,你也可以在 Red Hat Takes Over Leadership of OpenJDK 6 看到一些相關報導說明。

有關Sun JDK7、OpenJDK以及IcedTea之間的關係,也可以參考 Sun’s JDK7, OpenJDK & IcedTea: Disambiguation 這篇訪談。