Java 19 即将正式发布(2022年9月22号)。与 Java 9 之前相比,Java 的新版本的发布周期变成了半年一次。那 Java 的版本更新是如何管理的呢?首先从 JLS、JSR 和 JEP 说起。
JLS、JSR和JEP
JLS的全称是Java Language Specification,即Java语言规范。顾名思义,JLS是Java语言最权威的描述。它定义了Java语言的方方面面,是Java语言的终极指南。与JLS对应的是JVMS(Java Virtual Machine Specification),即Java虚拟机规范。与Java虚拟机相关的内容,包括 class 文件的格式和字节代码指令等,都在JVMS里面进行了规范。每次Java新的版本发布,Oracle 会在其官方网站上提供该版本的JLS和JVMS。
JSR 的全称是 Java Specification Requests,即 Java 规范请求。顾名思义,JSR表示的是对Java规范进行修改的请求。与JSR相关的是JCP(Java Community Process)组织。JCP是一个开放的Java社区,其作用是管理Java规范的更新,也就是管理JSR。虽然任何个人和公司都可以免费自由的加入JCP,但是除了大公司和诸如 Doug Lea 这样的知名人士之外,普通个人在里面的作用微乎其微。
JCP 中权利最大的机构是执行委员会,负责JSR的审核。JCP社区中的任何人或组织都可以提交JSR草案。JSR草案经过一系列的审核和相应的开发,最终由执行委员会表决通过之后,正式成为Java规范的一部分。
目前的JCP执行委员会的成员包括阿里巴巴、ARM、JetBrains、IBM、Intel、Oracle、SAP和Twitter等大公司。不少人批评JCP其实只是一个“橡皮图章”机构,大部分JSR都是大公司之间权衡较量之后的结果。但是也不能否认 JCP 在 Java 发展中的重要作用。
每个Java的版本都有一个对应的JSR,描述了这个版本对Java规范的改动。下面是一些在 Java 发展历史上产生过重要影响的JSR:
- JSR-175:Java注解。
- JSR-223:脚本语言支持。
- JSR-269:可插拔注解处理器API。
- JSR-335:Lambda表达式。
- JSR-376:Java平台模块系统。
- JSR-380:Bean验证API。
- JSR-317:JPA 2.0。
作为对Java规范的更新方式,JSR的问题在于其流程太过正式。大多数时候对 Java 的更新是从一些想法出发,然后逐步探索,以找到最适合的实现方式。JSR 的流程对这样的探索就显得太过繁琐,因为不可能在最开始的时候就有很完善的形式化的描述。
JEP 的出现正是为了解决这个问题。JEP的全称是JDK Enhancement Proposal,即JDK更新建议。相对于JSR,JEP的粒度更小,也没有形式化的流程。Python也有类似的更新方式,称为PEP。一般来说,多个JEP可以组成一个JSR。比如 Java 模块系统对应的JSR-376由6个JEP组成。从Java 10开始,Java 改变了发布的周期,变成了半年一次。Java 10 及其之后的Java新版本对应的 JSR 都由几个JEP组成。
所有的JEP都在 OpenJDK 的问题追踪系统(bugs.openjdk.org)中管理。JEP可能处于下表中的几个状态。
名称 | 说明 |
草案(DRAFT) | 这是最初的状态。JEP的作者根据模板提交草案。 |
已提交(SUBMITTED) | 作者提交JEP来进行审核。 |
候选(CANDIDATE) | JEP被加入到开发路线图中作为候选。 |
建议采用(PROPOSED TO TARGET) | JEP被建议提交加入到某个发布版本中。 |
建议放弃(PROPOSED TO DROP) | JEP被建议放弃。 |
已采用(TARGETED) | JEP被加入到某个发布版本中。 |
已集成(INTEGRATED) | JEP的相关代码已经集成。 |
已完成(COMPLETED) | JEP已经完成。 |
已关闭(CLOSED) | JEP相关的流程全部完成。 |
目前的 Java 版本更新是由 JEP 推动的。感兴趣的组织和个人都可以提交自己的 JEP。下图是一个处于候选状态的 JEP。
OpenJDK
OpenJDK是Java SE的免费和开放源代码的实现。从Java SE 7开始,OpenJDK是Java SE的官方参考实现。OpenJDK起源于2006年Sun公司把Java变成开源软件的承诺。经过10多年的努力,在Oracle、Red Hat、IBM、Apple和SAP等大公司的合作下,OpenJDK已经成为了Java平台的基石。
OpenJDK中包含很多组成部分,包括HotSpot虚拟机、Java标准库、Java编译器和相关工具等。OpenJDK 的源代码在 GitHub 上。
Java 的版本更新
从1996年JDK 1.0发布以来,Java的发展历经了很多个版本。在Java 10之前,Java的版本更新速度比较慢,通常耗时两到三年。Java 9更是在Java 8之后3年半才出来。这样的更新频率已经不适合现在的发展趋势了,毕竟其他的开发平台,如Go、NodeJS和Python等都在飞快的迭代发展。根据Java平台首席架构师Mark Reinhold的建议,从Java 9之后,Java改成了半年一次的火车发布(release train)模式。Java会在每年的3月和9月固定发布一个新版本。在固定时间的基础上,再来选择每个版本需要添加的功能。在半年一次的版本发布之外,还有每两年一次的长期支持版本,也就是LTS版本。目前的Java 8、Java 11和Java 17都是LTS版本,而下一个LTS版本是2023年9月发布的Java 21。除了LTS版本之外的其他版本,都认为是在上一个LTS版本之上的小的功能改进。
与Java的发布周期变动相关的是Oracle对Java版本的支持方式也发生了变化。从Java 9开始,Oracle提供了基于OpenJDK的Java发布版本,也就是从jdk.java.net可以下载的版本。这些版本的授权协议对商业使用是友好的。
从Java 11开始,Oracle除了之前提供的OpenJDK的发布版本之外,还提供付费支持的Oracle JDK。Oracle JDK需要从OTN(Oracle Technology Network)下载。Oracle JDK对个人用户的使用是免费的,商业使用则需要付费。Oracle对OpenJDK的发布版本只提供6个月的支持,也就是到下一个版本发布为止。这6个月的支持包括两个按季度的安全更新。也就是说,如果你想一直得到Oracle的OpenJDK发布版本的安全更新,就必须不断地更新版本。
如果你不想更新版本,但是又希望获取安全更新,可以使用其他服务商提供的Java发布版本。其他常用的Java发布版本包括 Eclipse Temurin、Amazon Corretto、Azul Zulu、SAP SapMachine 等。这些发布版本的好处是它们提供了安全更新,并且授权协议对商业使用友好。
对大多数用户来说,Eclipse Temurin 是目前比较好的选择,可以从 adoptium.net 下载。
本文暂时没有评论,来添加一个吧(●'◡'●)