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上获得。