当你还在用 Java 8 开发时,突然发现 Java 16 已经发布了,Java 17 已经在路上。Java 的版本变化也太快了吧。
在 Java 9 之前,Java 的版本更新一直都是比较慢的。比如,Java 9和 Java 8 之间的间隔时间长达3年半。如此长的发布间隔,显然不能满足当前的需求。
Java 9 之后的版本更新
从 Java 9 开始,Java 改变了之前的以功能特性为导向的发布周期,而是转为固定时间间隔的火车发布模式,也就是release train。火车定时发车,赶不上这次车的乘客,就只能等下一班火车。
Java的固定发布时间是每年的3月和9月。Java 16 是2021年3月发布的,而 Java 17则会在9月发布。
除了每年定期的两个版本之外,Java 还引入了LTS版本的概念。LTS表示长期支持版本。Ubuntu 和 NodeJS 都有类似的概念。目前 Java 8 和 Java 11 是LTS版本。Java 17 是下一个LTS版本。除了LTS版本之外的其他版本,都认为是在上一个LTS版本之上的小的功能改进。下图给出了 Java 不同版本的发布时间。
两次发布的间隔只有6个月。对于一些改动比较大的功能来说,6个月的时间有些短了。因此,Java引入了预览功能的概念。一些改动会以预览功能的形式在某个版本加入,并在后续的版本中不断的更新,直到成为正式功能。
当一个新功能在 Java 版本 N 中推出之后,就可以由开发人员来试用,并提供反馈。根据反馈的结果,该功能可以继续 Java 版本 N + 1 中预览,直到 Java 版本 N + 2 中稳定下来。
比如,记录类型,最早在 Java 14 中以预览功能的形式引入,经过 Java 15 的再次预览,在 Java 16 中成为正式功能。
不同的 Java 发行版本
另外一个常见的困惑是为什么 Java 有这么多的发行版本,除了 OpenJDK 之外,还有 AdoptOpenJDK ?这其实也和 Java 版本更新方式的变化有关。
OpenJDK是一个开源项目,源代码就在GitHub上。但是对一般用户来说,需要的不是源代码,而是可以直接运行的二进制包。这就需要有相应的基础设施,负责对OpenJDK的构建,运行自动化测试,以及提供下载等。这些成本一直都是Oracle在承担。
出于一些原因,Oracle不再提供对OpenJDK的LTS版本的安全更新支持。Oracle对OpenJDK的发布版本只提供6个月的支持,也就是到下一个版本发布为止。这6个月的支持包括两个按季度的安全更新。以 Java 15 为例,只有最初发布的 15 版本,以及后续的两个安全更新版本 15.0.1 和 15.0.2。之后就不再有 15 版本的更新。如果要获取更新,只能升级到 Java 16。
对于非LTS版本来说,这样还算合理。但是对LTS版本来说,不提供持续的安全更新是很大的问题。要获取更新,必须使用Oracle JDK。Oracle JDK对个人用户是免费的,对商业用户是收费的。绝大多数人是不想掏钱的。
因此,有很多的社区和公司就承担了提供LTS版本的更新的职责,就形成了非常多的Java发行版本,如下图所示。
AdoptOpenJDK 之前是最流行的社区驱动的 OpenJDK 发行版本。不过 AdoptOpenJDK 已经在2021年7月并入了 Eclipse 基金会,成为了 Eclipse Temurin。另外一部分的 Java 发行来自云计算平台,比如亚马逊的 Corretto。这些 Java 发行主要提供给运行在云平台上的 Java 应用。另外一部分的 Java 发行来自于提供企业级 Java 应用的公司,比如SAP。
对一般的开发者来说,Eclipse Temurin是目前最好的选择,可以从 Adoptium 下载。
另外一个问题是,这些不同的Java发行版本之间的差异大吗?通常的做法是从OpenJDK的代码库中fork出各自的代码库。对OpenJDK的代码改动会被合并到每个Java发行各自的代码库中。不同的Java发行可能会提供一些额外的功能。