(声明 :以下文字均来自《Java jdk8 学习笔记》 这本书)
在过去,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 为官方参考实现。
1. Oracle JDK7 与 OpenJDK7
与同为开放源代码的 Sun JDK 不同的是,Sun JDK 采用 JRL,而 OpenJDK7 采用 GPL (带有 GPL linking exception 的修正版本)
- JRL : 源代码可用于个人研究使用,但禁止任何商业用途
- GPL :允许商业上的使用
因此,OpenJDK7 必须删掉许多在两个授权间有冲突的程序代码,也不包括一些部署 ( Deployment ) 工具 (例如 Java Web Start 等) 以及软件套件 (例如 Java DB) 等;现在你在 Java Platform,Standard Edition 7 Reference Implementations (或Java Platform,Standard Edition 8 Reference Implementations)下载 RI 时,也会看到有基于 GNU General Public License version 2 与 Oracle Binary Code License 两个授权的版本。
Java Platform, Standard Edition 7 Reference Implementations:
https://jdk7.java.net/java-se-7-ri/
Java Platform, Standard Edition 8 Reference Implementations:
https://jdk8.java.net/java-se-8-ri/
由于 OpenJDK7 中有许多程序代码因授权冲突而必须删掉,因此原始的 OpenJDK7 是不完整的,因此无法通过 TCK 兼容测试,如果执行 java -version,原始的 OpenJDK7 显示的会是 openjdk version 字样,而不是 java version 字样。
为了解决授权问题,以便在 Fedora 或 Linux 分支中能自由发布 OpenJDK7,Red Hat 于 2007 年发起了 IcedTea 计划,而由于原始的 OpenJDK7 是不完整的,后来 IcedTea 致力于修补 OpenJDK7 使之完备,并通过了 TCK 兼容测试,如果使用 IcedTea 修补过后的 OpenJDK7,执行 java -version,就会显示 java version 字样。
2. Open JDK7 与 OpenJDK6
在 OpenJDK 官方网站,也可以看到 OpenJDK6 的版本,OpenJDK6 并不是 Sun JDK6 的分支,而是将 OpenJDK7 中 JDK7 的特性删掉,使之符合 JDK6 的规范,因而 OpenJDK6 实际上是 OpenJDK7 的分支,OpenJDK6 可以通过 TCK 兼容测试。
Oracle 从 2012 年 7 月以来,就打算结束对 JDK6 的支持,在 2013 年 2 月时宣布 JDK6 Update 43 时,宣布这是最后一个免费更新版本(实际上后来还有 Update 45 ),希望大家赶快升级至 JDK7。
由于 JDK6 在企业间仍广泛应用,Red Hat 于 2013 年 3 月时宣布持有 OpenJDK6 领导权,以能持续对 OpenJDK6 发现的漏洞与安全问题进行修补。