Java的基于时间的发布

2023/06/09

1. 概述

在本文中,我们将讨论新的基于时间的Java版本及其对所有类型开发人员的影响。

发布计划的更改包括更新Java版本的功能交付和支持级别。总体而言,这些变化与Oracle自2010年以来一直支持的Java明显不同。

2. 为什么要六个月发布?

对于我们这些习惯了Java历史上缓慢的发布节奏的人来说,这是一个非常重要的转变。为什么会有如此戏剧性的变化?

最初,Java围绕大型功能的引入定义了它的主要版本。这往往会造成延迟,就像我们在Java 8和9中都经历过的那样。它还减缓了语言创新,而其他具有更紧密反馈周期的语言也在不断发展。

简而言之,较短的发布周期会产生更小、更易于管理的进步。更小的功能更容易被采用

这种模式在当前条件下可以很好地配对,并允许JDK开发在类似于它支持的社区的敏捷方法中工作。此外,它使Java与NodeJS和Python等运行时相比更具竞争力。

当然,较慢的发布速度也有其好处,因此六个月的发布周期也在更大的长期支持框架中发挥作用,我们将在第4节中介绍。

3. 版本号变更

此更改的一个机械方面是新的版本号方案。

3.1 JEP 223版本字符串方案

我们都熟悉编入JEP 223的旧版本。该方案使版本号递增并传递额外信息。

   Actual                    Hypothetical
Release Type           long               short
------------           ------------------------ 
Security 2013/06       1.7.0_25-b15       7u25
Minor    2013/09       1.7.0_40-b43       7u40
Security 2013/10       1.7.0_45-b18       7u45
Security 2014/01       1.7.0_51-b13       7u51
Minor    2014/05       1.7.0_60-b19       7u60

如果我们在版本8或更早版本的JVM上运行java-version,我们将看到如下内容

>java -version
java version "1.6.0_27"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0_27-b07)
Java HotSpot(TM) Client VM (build 1.6.0_27-b13, mixed mode, sharing)

在这种情况下,我们可能会猜测这是针对Java 6的,这是正确的,而第27次更新是错误的。编号方案并不像看起来那么直观。

次要版本是10的倍数,而安全版本则包含所有其他内容。通常,我们会看到短字符串附加到我们的本地安装上,例如JDK 1.8u174。下一个版本可能是JDK 1.8u180,这将是一个带有新修复的次要版本。

3.2 新版本字符串方案

根据JEP中的Mark Reinhold的说法,新的版本字符串方案将“重新编码版本号,而不是编码兼容性和重要性,而是根据发布周期来编码时间的流逝” 。

让我们来看看一些:

9.0.4
11.0.2
10.0.1

乍一看,这似乎是语义版本控制然而,这种情况并非如此

使用语义版本控制,典型的结构是$MAJOR.$MINOR.$PATCH,但是Java的新版本结构是:

$FEATURE.$INTERIM.$UPDATE.$PATCH

$FEATURE是我们可能认为的主要版本,但无论兼容性保证如何,它都会每六个月递增一次。$PATCH用于维护版本。但是,这就是相似之处停止的地方。

首先,$INTERIM是一个占位符,由Oracle保留以备将来需要。目前,它将永远为零

其次,$UPDATE与$FEATURE一样是基于时间的,在最新功能发布后每月更新一次。

最后,尾随零被截断。

这意味着11是Java 11的版本号,于2018年9月发布,11.0.1是10月发布的第一个月度更新版本,而11.0.1.3将是10月版本的假设第三个补丁版本。

4. 多版本分发

接下来,让我们看看如何选择合适的版本。

4.1 稳定

简单地说,Java现在有一个快速通道,每六个月一次,一个慢速通道,每三年一次。每个第三年的版本称为LTS版本

在快速通道上,语言正在孵化中发布功能。这些语言特性在LTS版本中稳定下来。

因此,对于可以接受波动性以换取使用新功能的公司,他们可以使用快速通道。对于重视稳定性并可以等待升级的企业,他们可以在每个LTS版本时升级。

对JDK版本进行试验使开发人员能够找到最适合的版本。

4.2 支持

当然,还有支持问题。现在Java 8支持已经停止,我们该怎么办?

如前所述,答案来自LTS版本,Java 11是最新的LTS版本,Java 17是下一个。更新将由Oracle和Azul等供应商提供和支持。

如果我们可以信任社区的支持,那么Redhat、IBM和其他公司已经表示支持为OpenJDK应用错误修复。此外,AdoptOpenJDK项目为OpenJDK提供了预构建的二进制文件。

4.3 许可

有些人容易混淆的地方之一是OpenJDK和Oracle JDK之间的区别。

实际上,根据Brian Goetz的说法,它们几乎完全相同,不同之处仅在于修复了哪些漏洞和安全补丁。

OpenJDK是大多数派生JDK的源代码,并且保持免费。从Java 11开始,Oracle将对包含额外支持和服务的Oracle JDK收取商业许可费用。

4.4 碎片化

随着更频繁的发布,碎片化可能成为一个问题。假设地,每个人都可以运行具有不同功能的不同版本的Java,甚至比现在更多。

当然,容器化可以帮助解决这个问题。从Docker和CoreOS到Red Hat的OpenShift,容器化提供了所需的隔离,不再强制在整个服务器上使用Java的一个安装位置。

5. 总结

总之,我们可以对Oracle的Java团队抱有更多期望,每六个月定期发布Java。作为Java开发人员,每六个月出现新语言功能的前景令人兴奋。

如果我们需要支持和许可,以及如何应对碎片化,那么在我们决定我们的升级渠道是什么时,让我们牢记一些含义。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章