设为首页 加入收藏

TOP

JDK8到JDK17有哪些吸引人的新特性?(一)
2023-07-25 21:31:34 】 浏览:91
Tags:JDK8 JDK17

作者:京东零售 刘一达

前言

2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理。任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上。但是需要一个组织审核来确保构建的发行版是有效的, 这个组织就是JCP(Java Community Process)。2009年,SUN公司被Oracle公司"白嫖"(参考2018年Google赔款),此时大家使用的JDK通常都是Oracle公司的OpenJDK构建版本-OracleJDK。但是,Oracle公司是一个明显只讲商业而不管情怀的公司,接手Java商标之后,明显加快了JDK的发布版本。2018年9月25日,JDK11成功发布,这是一个LTS版本,包含了17个JEP的更新。与此同时,Oracle把JDK11起以往的商业特性全部开源给OpenJDK(例如:ZGC和Flight Recorder)。根据Oracle的官方说法(Oracle JDK Releases for Java 11 and Later),从JDK11之后,OracleJDK与OpenJDK的功能基本一致。然后,Oracle宣布以后将会同时发行两款JDK:1. 一个是以GPLv2+CE协议下,由Oracle发行OpenJDK(简称为Oracle OpenJDK);2. 另一个是在OTN协议下的传统OracleJDK。这两个JDK共享绝大多数源码,核心差异在于前者可以免费在开发、测试和生产环境下使用,但是只有半年时间的更新支持。后者各个人可以免费使用,但是生产环境中商用就必须付费,可以有三年时间的更新支持。
2021年9月14日,Oracle JDK17发布,目前也是最新的Java LTS版本。有意思的是,Oracle竟然"朝令夕改",OracleJDK17竟然是免费的开源协议,并支撑长达8年的维护计划。目前公司内部使用的OracleJDK8最高版本为1.8.0.192,而Oracle在JDK8上开源协议支持的最高免费版本为jdk1.8.0_202。2022年Spring6和SpringBoot3相继推出,而支持的最低版本为JDK17。综上所述,JDK8为目前绝大多数以稳定性为主的系统第一选择,但是升级到高版本JDK也只是时间问题。下面图表展示了JDk8到JDK17的每个版本升级的JEP个数。
image.png
通过以上图表,我们可以得出结论,JDK8到JDK17包含大量新特性,为Oracle在Java近5年来的智慧结晶。目前市面上的公司还是只有少数系统会选择JDK11或者JDK17作为线上技术选型,如果选择从JDK8升级到JDK17必然会有非常大的挑战和较多需要填的坑。本文主要介绍JDK8到JDk17近200个JEP中比较有价值的新特性(按照价值从高到低排序),这里有一部分特性作者也在线上环境使用过,也会将其中的使用心得分享给大家。

核心JEP功能及原理介绍

一、Java平台模块化系统(Jigsaw项目)

JDK9最耀眼的新特性就是Java平台模块化系统(JPMS,Java Platform Module System),通过Jigsaw项目实施。Jigsaw项目是Java发展过程的一个巨大里程碑,Java模块系统对Java系统产生非常深远的影响。与JDK的函数式编程和 Lamda表达式存在本质不同 ,Java模块系统是对整个Java生态系统做出的改变。

同时也是JDK7到JDK9的第一跳票王项目。Jigsaw项目本计划于在2010年伴随着JDK7发布,随着Sun公司的没落及Oracle公司的接手,Jigsaw项目从JDK7一直跳票到JDK9才发布。前后经历了前后将近10年的时间。即使在2017JDK9发布前夕,Jigsaw项目还是差点胎死腹中。原因是以IBM和Redhat为首的13家企业在JCP委员会上一手否决了Jigsaw项目作为Java模块化规范进入JDK9发布范围的规划。原因无非就是IBM希望为自己的OSGI技术在Java模块化规范中争取一席之地。但是Oracle公司没有任何的退让,不惜向JCP发去公开信,声称如果Jigsaw提案无法通过,那么Oracle将直接自己开发带有Jigsaw项目的java新版本。经历了前后6次投票,最终JDK9还是带着Jigsaw项目最终发布了。但是,令人失望的是,Java模块化规范中还是给Maven、Gradle和OSGI等项目保留了一席之地。对于用户来说,想要实现完整模块化项目,必须使用多个技术相互合作,还是增加了复杂性。如果大家想要对模块化技术有更多深入了解,推荐阅读书籍《Java9模块化开发:核心原则与实践》

1、什么是Java模块化?

简单理解,Java模块化就是将目前多个包(package)组成一个封装体,这个封装体有它的逻辑含义 ,同时也存在具体实例。同时模块遵循以下三个核心原则:

  1. 强封装性:一个模块可以选择性的对其他模块隐藏部分实现细节。

  2. 定义良好的接口:一个模块只有封装是不够的,还要通过对外暴露接口与其他模块交互。因此,暴露的接口必须有良好的定义。

  3. 显示依赖:一个模块通常需要协同其他模块一起工作,该模块必须显示的依赖其他模块 ,这些依赖关系同时也是模块定义的一部分。

2、为什么要做模块化?

模块化是分而治之的一个重要实践机制,微服务、OSGI和DDD都可以看到模块化思想的影子。现在很多大型的Java项目都是通过maven或者gradle进行版本管理和项目构建,模块的概念在Maven和gradle中早就存在,两者的不同下文也会说到。现在让我们一起回顾一下目前在使用JDK搭建复杂项目时遇到的一些问题:

2.1 如何使得Java SE应用程序更加轻量级的部署?

java包的本质只不过是类的限定名。jar包的本质就是将一组类组合到一起。一旦将多个Jar包放入ClassPath,最终得到只不过是一大堆文件而已。如何维护这么庞大的文件结构?目前最有效的方式,也是只能依赖mave或者gradle等项目构建工具。那最底层的Java平台的Jar包如何维护?如果我只是想部署一个简答的 helloworld应用,我需要一个JRE和一个用户编译的Jar包,并将这个Jar包放到classpath中去。JDK9以前,JRE的运行依赖我们的核心java类库-rt.jar。rt.jar是一个开箱即用的全量java类库,要么不使用,要么使用全部。直到JDK8,rt.jar的大小为60M,随着JDK的持续发展,这个包必然会越来越大。而且全量的java类库,给JRE也带来了额外的性能损耗。Java应用程序如果能选择性的加载rt.jar中的文件该多好?

2.2 在暴露的JAR包中,如何隐藏部分API和类型?

在使用Dubbo等RPC框架中,provider需要提供调用的接口定义Jar包,在该Jar包中包含一个共该Jar包内部使用的常量聚合类Constannt,放在constant包内。如何才能暴露JAR包的同时,隐藏常量聚合类Constant?

2.3 一直遭受NoClassDefFoundError的折磨

通过什么方式,可以知道一个Jar包依赖了哪些其他的 Jar包?JDK本身目前没有提供,可以通过Maven工具完成。那为什么不让Jav

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java--IO流 ? 字节流 下一篇Nexus搭建maven仓库并使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目