技术前沿:关注与传播前沿的技术与资讯
本文是基于InfoQ近期公布的Java生态的趋势报告2021,个人对它一些解读。
InfoQ的Java趋势报告主要是关注Java及其关联的Kotlin,Scala等语言以及Java生态的框架与工具等。
原文载于InfoQ,地址为:https://www.infoq.com/articles/java-jvm-trends-2021
趋势图
阶段划分
InfoQ将Java技术趋势划分为四个阶段,分别是
•Late Majority (晚期主流)
当前仍然属于主流使用的一些语言,框架或工具。但使用率在下降
•Early Majority (早期主流)
正在逐步被采用的一些语言,框架或工具。使用率将会上升并会成为主流
•Early Adopters (早期采用)
在少数范围内被接纳和采用,未来可期
•Innovators (创新者)
仍然处于早期阶段,或在开发中未发布稳定版本的一些技术或框架。但非常被认可与关注,未来大概率会被主流接纳的。
报告解读
JDK 11 与 JDK 17
JDK 8与JDK 11均处于Late Majority,而JDK 17处于Innovators。
在2021的Java中,使用JDK 11的版本与JDK 8的版本的比例大致相当。随着JDK 17长期支持版本的发布及更灵活的一些Java语言特性,相信转向JDK 17的会越来越多。
解读
JDK 8确实是JDK中相当革命性的一个版本,特别是它引入了Lambda以及Stream这两个语言特性。但这并不能成为我们一直停留在JDK 8不动的原因所在。
仅仅从考虑LTS长期支持版的角度来说,更新到使用JDK 11也是更好的选择。比如你可以在JDK 11中使用var局部变量等一些更好的特性。
关于使用JDK 8我听到的最多的一种说法是:它足够使用了
好吧,我不太理解,难道JDK 11不足够使用了?JDK 11完全兼容JDK 8,所谓的在JDK 8中足够使用的点同样在JDK 11中可以使用。
当然,考虑到风险,已经使用JDK 8的项目你可以不更新,但对于新的项目,你完全可以毫不犹豫的更新到JDK 11
就比如我的middd-java,最低支持版本就是JDK 11,这完全没有任何问题。
而新的LTS版本JDK 17提供更多的更好的特性,比如Seal Class,Record等,这些都让Java变得更加灵活,能写出更简洁的代码。
不要犹豫,下个项目开始使用新的JDK吧。
Kotlin
在趋势报告中,Kotlin位于Early Majority
解读
我使用Kotlin比较多,我的myddd-vertx就是基于Kotlin开发的。
相比较Java而言,Kotlin毫无疑问更简洁与优雅。而且它又几乎完全兼容Java,Java生态中的所有框架或类库都能被它使用。支持Kotlin的生态也越来越多,比如Gradle同时支持了Kotlin与Grovvy两种DSL语言,而Spring也对Kotlin提供了很好的支持,而Google干脆把它做为Android开发的第一语言。
但我不确认趋势报告中的主流是否把Android开发给算上了,按我的估计,至少在国内,不算上Android开发,真正用Kotlin取代Java的,应该是极少数。
大多数相信仍然会选择Java。
但这不影响我对它的喜爱。我个人在后端的项目,后续也会以Kotlin为主。
Java EE/Jakarta EE
当前主流使用的仍然是Java EE 8,但转向Jakarta EE 8正在成为早期主流。
解读
可能有相当一部分程序员并不清楚Java EE和Jakarta EE是怎么一回事,为什么会把这两个放在一起说。
Java EE是Java的企业级版本,提供了一些当前使用的非常多的企业级功能,比如JPA,这个是属于Java EE的功能点之一。还有一个大家熟知的Servlet,也是Java EE的功能。
那Jakarta EE又是什么?
Java EE本来属于Oracle,但2018年的时候,Oracle决定将它捐献给Eclipse基金会,由Eclipse基金会负责后续版本的维护与更新,但捐献时确附带了一个非常有争议的要求:不能使用Java EE这个品牌名称。(话说Oracle果然令程序员不喜欢)
在经历了漫长的讨论后,最终决定将其重新命名为Jakarta EE,并基于Java EE 8发布了Jakarta EE 8.
Jakarta EE 8与Java EE 8是完全兼容的。除了一点,包名不一样。(因为不允许使用原有的品牌名称,自然不能用原有的包名了)
事实上,使用Java EE 8的仍然是晚期主流,但越来越多的框架正在转向Jakarta EE 8.
在我的myddd-java以及myddd-vertx中,对JPA的依赖,仍然是Java EE 8及对应的javax.persistence包名。
2022年会迁移到Jakarta EE 8
OpenJDK
报告指出,OpenJDK的下游构建版本似乎越来越多,这会令人觉得非常困惑。
解读
国内应该主流使用的是Oracle JDK,对于OpenJDK的相关信息可能知晓的不是非常详细。
除了Oracle JDK以外,还有相当多不同版本的OpenJDK的构建。
比如Eclipse有自己的OpenJDK构建,官网是:https://adoptium.net/,2021微软也加入了JCP大家庭,也提供了自己的OpenJDK构建。类似的OpenJDK构建版本挺多的,比如Amazon也有自己的OpenJDK。
另外Oracle本身也有自己的OpenJDK构建版本。
这是为什么?为什么会有这么多OpenJDK构建。
其实是商业支持的问题,比如Oracle JDK 8, Oracle事实上在2019年就停止了免费JDK 8的免费支持。如果你仍然在使用Oracle JDK 8又想获得最新的支持补丁等,你就得购买Oracle的商业支持。
所以,就会有相当多的组织或机构就构建了自己的OpenJDK并提供持续的支持。
现在你明白了吧。
我使用的都是OpenJDK,没有使用Oracle JDK。
当然,这些JDK几乎完全一致,大多数情况下你不用太过于担心使用哪个版本。
Spring Framework 6与Spring Boot 3
Spring将在2022发布重量级版本Spring Framework 6以及Spring Boot 3
解读
论Java生态中使用多的,相信没有比Spring更重量级的了。
Spring将在2022发布重量级版本Spring Framework 6以及Spring Boot 3. 这是一个重量级的版本更新。
尤其需要关注的是Spring在这个版本相当激进,最低只支持JDK 17.
还是回到前面的建议,那些认为JDK 8足够使用的程序员们,不得不面临这一选择的困境。
MicroStream
2021年,MicroStream开源了自己的5.0版本,这是Java生态中值得关注的一个框架。
解读
简单说下MicroStream是啥,它是Hibernate的可替代选择方案。
对于Java生态中,存储数据最重要一个就是Hibernate及其背后的关系型数据库了。ORM框架的流行是得益于OO对象与关系型数据两间之间的失调,所以ORM做了中间的一层转换以解决这个失调。
那自然就会有人想到,为什么不直接存储OO对象,基于OO对象来提供存储及查询的相关功能呢,为什么要把OO对象转为二维的关系去存储呢?
好问题。
所以,这就是MicroStream的实现思路,它直接以OO的方式存储及查询对象。不再使用关系型数据表去存储OO对象。
按照其官方的自述,MicroStream事实上在生产中已稳定使用6年之久,是经过生产验证的,2021年,MicroStream发布了5.0并将其开源。
所以,现在Java的OO编码中,除了使用关系型数据库来存储,你还多了另一种选择,OO存储了。
你有没有兴趣?
Quarkus
报告将Quarkus列为早期流行
解读
前面我也说过,在Java生态中,使用最多的生态就是Spring了,给人的感觉Spring简直一统天下了都快。
当然不是,有越来越多的开发者及组织开始转向Quarkus.
Quarkus是什么,简单来理解,它是Spring之外的可替换方案,那它的特点是什么?
•全堆栈 Kubernetes 原生框架•命令式和响应式实现•云原生支持
与Spring一样,Quarkus也提供了一整套框架的搭配来提供整体的解决方案,比如Apache Kafka、RESTEasy (JAX-RS)、Hibernate ORM (JPA)、Spring、Infinispan、Camel 等。
是不是很像Spring Boot?
如果你的团队敢于尝试新的技术,那Quarkus的确是非常好的替代方案
Java 与 Visual Studio Code
在所有IDE中,VSC以其支持多种不同的语言获取了一些关注与使用。可能会对Eclipse带来挑战。
解读
我经常使用VSC,但那主要是前端语言及相关的开发中才使用。
VSC最强大的吸引力在于它的插件非常之多,而且各种语言的插件都有。不考虑使用体验,的确可以在VSC上开发Java,Python,Shell,TypeScrip甚至是C等各种语言。
但VSC主要仍然是前端编程人员的工具,也许可能有一些人会尝鲜去使用它开发Java,但我不认为它的体验能和IDEA相比。
至于Eclipse,我已经很久没有使用过了,不太肯定VSC开发Java的体验与Eclipse相比之如何。
报告中指明的VSC对各种语言的支持比其它Java IDEA好,这是事实。但在Java中,同时穿插其它语言编程这种概率也不是太高,所以我认为使用VSC开发Java只会是小众行为。
END
这篇文章中,我只针对我知道的一些技术点来解读了下,大家可以阅读文章原文,以了解更多的Java趋势。