Java 17 已发布!
Sharat Chander 于 2021 年 9 月 14 日发布Oracle 荣幸地宣布 JDK 17 已正式发布。此版本是通过六个月的发布节奏按时交付的第八个功能版本。这种可预测性让开发人员可以轻松管理他们对创新的采用,这要归功于预期变更的稳定流。
Java 提升性能、稳定性和安全性的能力使其持续成为全球最流行的编程语言。根据 IDC 报告,超过一千万名开发人员(占全球全职开发人员的 75%)使用 Java,多于任何其他语言。
JDK 17 现已发布!
Oracle 现为开发人员、最终用户和企业提供 JDK 17。作为 LTS 版本,Oracle JDK 17 将在 Oracle 关键补丁更新 (CPU) 时间表中概述的 Oracle Java SE 支持路线图中至少获得 8 年的性能、稳定性和安全更新。
Oracle JDK 18,下一个六个月节奏版本现已计划于 2022 年 3 月发布。
Java 17 是 2018 年宣布的发布节奏下的第二个长期支持 (LTS)。Oracle 已宣布计划将未来 LTS 版本之间的间隔从 3 年缩短至 2 年,因此您应预计下一个 LTS 将是 2023 年 9 月的 Java 21。
Oracle JDK 17 的另一个重要变更是 新的简单许可条款,这将允许公司在未来至少三年内免费使用 Oracle JDK 17,包括每季度的性能、稳定性和安全补丁,从而允许与下一个 LTS 版本重叠整整一年。Java SE 订阅者可以访问 Oracle 的 Java SE 支持和商业功能,例如 GraalVM Enterprise、Java Management Service 和高级管理控制台。
Java 17,携手共进
与之前的版本一样,在 Java 17 中,我们继续赞扬 OpenJDK 社区中的许多个人和组织的贡献——我们共同构建 Java!
JDK 17 修复率
多年来,JDK 版本中的变更率基本保持不变,但在六个月的节奏下,交付生产就绪功能和改进的速度已大大提高。
与我们过去几年中每隔几年进行数万次修复并交付近百个 JEP(JDK 增强提案)的做法不同,现在我们会在更易于管理且可预测的六个月计划中,通过精简的功能版本交付增强功能。这些变更包括从重大新功能到常规维护、错误修复和文档改进的细微增强。每个变更都以一个提交的形式表示,对应于 JDK Bug System 中的单个问题。
在 Java 12 到 Java 17 正式发布时标记为已修复的 12,733 个 JIRA 问题中,9,218 个是由为 Oracle 工作的人员完成的,而 3,515 个是由个人开发者和为其他组织工作的开发者贡献的。
在 Java 17 中,在标记为已修复的 2,645 个 JIRA 问题中,1,774 个是由 Oracle 完成的,而 871 个是由 Java 社区的其他成员贡献的。查看这些问题并从受让人处整理组织数据,会得到以下图表,其中列出了赞助 Java 17 中贡献开发的组织
Oracle 要感谢为 Amazon、NTT Data、Red Hat、SAP 和 Tencent 等组织工作的开发者,感谢他们做出的杰出贡献。我们也很感谢来自 Bellsoft、DataDog、龙芯、Skymatic 等较小组织以及独立开发者的贡献,他们共同贡献了 Java 17 中 6% 的修复。
我们同样感谢审阅提议变更的众多经验丰富的开发者、尝试早期访问版本并报告问题的早期采用者,以及在 OpenJDK 邮件列表中提供反馈的敬业专业人士。
以下个人提供了宝贵的构建质量反馈,记录了高质量的错误,或提供了频繁的更新
- Jaikiran Pai(Apache Ant)
- Rick Hillegas(Apache Derby)
- Uwe Schindler(Apache Lucene)
- Mark Thomas(Apache Tomcat)
- Martin Grigorov(Apache Tomcat、Apache Wicket)
- Rafael Winterhalter(Byte Buddy)
- Yoann Rodière(Hibernate ORM、Validator、Search、Reactive)
- Marc Hoffman(JaCoCo)
- Lukas Eder(jOOQ)
- Christian Stein(JUnit 5)
- David Karnok(RxJava)
此外,通过 质量推广 计划,我们要感谢以下 FOSS 项目和个人,他们提供了对 Java 17 早期访问版本的出色反馈,帮助提高了该版本的质量。
- Apache Aries Spi Fly
- Apache CXF
- Apache Zookeeper(Enrico Olivelli)
- Aries JAX-RS
- BurningWave
- DataSketches
- Eclipse Collections
- Eo-yaml
- FXGL
- JabRef
- JaCoCo(Evgeny Mandikov)
- Java Katas(Chandra Guntur)
- Jenkins
- Jobrunr
- JOOQ
- JUnit
- Karate
- MyBatis(Iwao Ave)
- Netty
- PDFsam
- Sedja
- Selenide
- Syncope
- Vaadin
Java 17 中的新增功能
除了数千项性能、稳定性和安全性更新之外,Java 17 还提供了 十四项增强功能/变更(称为 JDK 增强提案 - JEP),包括三个孵化器模块和一个预览功能。
孵化器模块允许将非最终 API 和非最终工具交到开发者和用户手中,以收集反馈,最终提高 Java 平台的质量。
同样地,预览功能是 Java SE 平台完全指定且完全实现的语言或 VM 功能;但并非永久性的。它们在 JDK 功能版本中提供,以便在它们在未来版本中成为永久功能之前,根据实际使用情况允许开发人员提供反馈。这还为工具供应商提供了在功能最终确定为 Java SE 标准之前对其提供支持的机会。
我们将随 Java 17 提供的十四个 JEP 分为七类
1. 语言功能
JEP 409:密封类
密封类允许 API 设计人员指定哪些类或接口可以扩展或实现给定的类。在对问题进行建模时拥有一个详尽的案例列表可以简化开发。JEP 409 在 OpenJDK Project Amber中开发,该项目旨在通过 Java 编程语言的演进不断提高开发人员的生产力。
2. 核心库的更新和改进
JEP 306:恢复始终严格的浮点语义
Java 编程语言和 Java 虚拟机最初只有严格的浮点语义。从 JDK 1.2 开始,为了适应当时当前硬件架构的限制,默认允许这些严格语义中的微小差异。这些差异不再有用或必要,并且已被 JEP 306 删除。
JEP 356:增强的伪随机数生成器
对 java.util.random
的更新改进了不同 PRNG(伪随机数生成器)的互操作性,并使其可以根据要求轻松请求算法,而不是硬编码特定实现。更改包括新的接口类型和伪随机数生成器 (PRNG) 的实现,包括可跳转 PRNG 和一类额外的可分割 PRNG 算法 (LXM) 以及一个新的 RandomGeneratorFactory
类。
JEP 382:新的 macOS 渲染管道
此新管道通过使用新的 Apple Metal API 为 macOS 实现 Java 2D 渲染管道,从而减少了 JDK 对已弃用的 Apple OpenGL API 的依赖性。
JEP 415:特定于上下文的反序列化过滤器
通过 JDK 9 添加的过滤传入序列化数据 (JEP 290) 得到改进,允许应用程序通过 JVM 范围的过滤器工厂配置特定于上下文和动态选择的反序列化过滤器,该过滤器工厂在被调用时为每个单独的反序列化操作选择一个过滤器。这使得无需每个流的创建者更新其代码或使过滤器过于严格或过于宽松即可利用反序列化过滤器。
3. 新平台支持
JEP 391:macOS AArch 64 端口
提供了一个适用于 macOS 的 JDK 版本,该版本可在 Apple 较新的基于 Arm 64 的系统上原生运行。
4. 预览和孵化器
JEP 406:switch 的模式匹配预览
增强 Java 编程语言,允许在 switch 语句或 switch 表达式中测试模式匹配。在 switch 中使用模式匹配,可以简洁安全地表达复杂的面向数据查询。JEP 406 在 OpenJDK Project Amber中开发。
JEP 412:外部函数和内存 API 孵化器
通过 Java 程序与 Java 运行时外部的代码和数据进行交互,改进了 JDK 14 和 JDK 15 中引入的 API。通过有效调用外部函数(即 JVM 外部的代码)和安全访问外部内存(即 JVM 不管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会出现 JNI 的脆弱性和危险性。JEP 412 在 OpenJDK Project Panama 中开发,旨在简化 Java 代码与外部(非 Java)API 之间的交互。
JEP 414:矢量 API 第二个孵化器
增强了允许以一种方式表示矢量计算的 API,这种方式将可靠地在运行时编译为受支持 CPU 架构上的最佳矢量指令。矢量操作可以提供优于等效标量计算的性能,并且在机器学习、人工智能和密码学等领域非常常见。JEP 412 在 OpenJDK Project Panama 中开发。
5. 未来 Java 程序的证明
JEP 403:强封装 JDK 内部
不再可以通过单个命令行选项来放松内部元素的强封装,就像在 JDK 9 到 JDK 16 中所做的那样。此更改默认隐藏所有内部 API,除了少数几个 关键内部 API,例如 `sun.misc.Unsafe。仍然可以访问现有的内部 API,但这现在需要在命令行参数或 JAR 文件清单属性中枚举应该放松封装的每个包。此更改将导致更安全的应用程序,并且对非标准内部实现的依赖性更少。
JEP 403 是 JDK 16 中的 JEP 396 的延续,它将 JDK 从默认的放松强封装转换为默认的强封装。
6. 弃用和删除
JEP 411:弃用安全管理器以进行删除
安全管理器源自 Java 1.0。多年来,它一直不是保护客户端 Java 代码的主要手段,并且很少用于保护服务器端代码。
JEP 398:弃用 Applet API 以进行删除
自所有 Web 浏览器供应商都已删除对 Java 浏览器插件的支持或宣布了这样做的计划以来,Applet API 已变得基本无关紧要。Applet API 之前在 2017 年 9 月的 Java 9 (JEP 289) 中已弃用(尽管不是为了删除)。
JEP 407:删除 RMI 激活
已删除远程方法调用 (RMI) 激活机制。此更改不影响 RMI 的其余部分。RMI 激活机制在 2020 年 9 月的 JDK 15 中已弃用以进行删除。
7. 适用于 OpenJDK 贡献者
JEP 410:删除实验性 AOT 和 JIT 编译器
自 JDK 9 引入基于 Java 的提前 (AOT) 和即时 (JIT) 编译器以来,由于出现了更广泛支持的替代方案,它们的使用率很低,并且维护它们需要付出很大的努力。作为可选组件,它们已从 JDK 16 中删除。此 JEP 从 OpenJDK 项目中删除了源代码。
工具支持
工具和库对新功能的及时支持有助于提高开发人员的生产力。通过 Java 17,我们继续欢迎领先的 IDE 供应商的努力,他们的最新更新为开发人员提供了对当前 Java 版本的支持。开发人员可以期待使用以下 IDE 立即利用 Java 17 支持
资源
Java 仍然是软件程序员的首选编程语言。正如 Java 17 及时交付改进所展示的那样,通过持续的周密计划和生态系统参与,Java 平台已做好充分准备,可以在云中进行现代开发和增长。
通过以下方式继续了解最新消息和更新
- 访问 Inside.Java(Oracle Java 团队的新闻和观点)
- 收听 Inside.Java 播客(Oracle 的 Java 开发人员提供的一档音频节目,讨论语言、JVM、OpenJDK、平台安全、Loom 和 Panama 等创新项目以及介于两者之间的一切内容)。
- 观看 Inside.Java 新闻播报(将 Inside.Java 播客扩展为视频格式的视频节目)。
- 加入 OpenJDK 邮件列表(了解您最喜爱的 OpenJDK 项目进展的地方)。
- 在 Twitter 上关注 OpenJDK 和 Java(提供 Java 持续演进的更新和新闻的社交流)。
- 阅读 Java Magazine;Oracle 的数字 Java 出版物,提供开发人员撰写的技术文章。