Java 版本更新周期与 Java 发行

当你还在用 Java 8 开发时,突然发现 Java 16 已经发布了,Java 17 已经在路上。Java 的版本变化也太快了吧。

不过当你打开 Chrome,发现 Chrome 的版本已经是 92 之后,就发现一切还好。

在 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 LTS

两次发布的间隔只有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.115.0.2。之后就不再有 15 版本的更新。如果要获取更新,只能升级到Java 16。

对于非LTS版本来说,这样还算合理。但是对LTS版本来说,不提供持续的安全更新是很大的问题。要获取更新,必须使用Oracle JDK。Oracle JDK对个人用户是免费的,对商业用户是收费的。绝大多数人是不想掏钱的。

因此,有很多的社区和公司就承担了提供LTS版本的更新的职责,就形成了非常多的Java发行版本。

Java发行版本

AdoptOpenJDK 之前是最流行的社区驱动的 OpenJDK 发行版本。不过 AdoptOpenJDK 已经在2021年7月并入了 Eclipse 基金会,成为了 Eclipse Temurin。另外一部分的 Java 发行来自云计算平台,比如亚马逊的 Corretto。这些 Java 发行主要提供给运行在云平台上的 Java 应用。另外一部分的 Java 发行来自于提供企业级 Java 应用的公司,比如SAP。

对一般的开发者来说,Eclipse Temurin是目前最好的选择,可以从 Adoptium 下载。

Adoptium

另外一个问题是,这些不同的Java发行版本之间的差异大吗?通常的做法是从OpenJDK的代码库中fork出各自的代码库。对OpenJDK的代码改动会被合并到每个Java发行各自的代码库中。不同的Java发行可能会提供一些额外的功能。

版权所有 © 2024 灵动代码