我该用java12还是坚持java11?

     2022-04-27     224

关键词:

技术分享图片

距离 Java 11 的正式发布已过去四个多月,而 Java 12 也正在赶来的路上。根据此前的一项关于开发者使用的 Java 版本的调查显示,Java 8 仍然是开发者的主流选择,而 Java 11 是 Java 8 之后的首个 LTS 版本,所以有不少开发者表示会选择升级至 Java 11。按照 Java 的发布计划,Java 12 将于明年 3 月推出,那么问题来了,我们是应该采用 Java 12,还是坚持使用 Java 11 呢?

可能你会觉得这是一个无关紧要的问题,但对于那些需要在 JVM 中使用 Java 的开发者,或是比较看重 Java 新特性的开发者,这是一项十分重要的决策。这篇文章将和大家就这个问题进行相关的分析。

Java 发布计划

现在每六个月就会发布一个新的 Java 版本,所以尽管 Java 11 才发布不久,但距离 Java 12 的发布也就剩下不到五个月的时间。作为发布计划的一部分,某些版本会被指定为长期支持版本(LTS),它们会获得四年或更长时间的技术支持和安全补丁。所以这些版本通常会被称为“主要版本” —— 不是因为它们拥有更多的功能特性,而是因为它们具有长期的技术支持。

预计 Java 11 的更新补丁(11.0.1, 11.0.2, 11.0.3 等)将比 Java 8 的补丁(8u20, 8u40, 8u60)更小更简单。因为 Java 11 的更新将更加集中在安全补丁上,不会像 Java 8 的更新那样带来内部的功能增强。因为 Oracle 希望将 Java 12, 13, 14 等这些版本当做是小更新版本,类比成 Java 8 的话,即是 Java 11u20, 11u40。

Oracle 高级员工一再认为像 8u20 和 8u40 这样的更新常常会带来破坏性的变更,但本文作者表示这不是自己的经历,他记得的唯一有破坏性的变化是为 Javadoc 添加了 --allow-script-in-comments,但它也不是 Java 的核心部分。因此,他从不担心升级到最新版本带来的影响 —— 因为这是 Java 平台的核心优势。

下面深入了解一下为什么在旧的发布模式下,升级版本不会导致任何问题。先看一下新旧发布模式之间的差异:
技术分享图片

Oracle 的官方观点认为:与 Java 7->8->9 相比,Java 9->10->11的升级和 8->8u20->8u40 更相似。

表格清楚地显示新模式下的 Java 版本发布都会包含许多变更,包括语言变更和 JVM 变更,这两者都会对 IDE、字节码库和框架产生重大影响。此外,不仅会新增其他 API,还会有 API 被删除(这在 Java 8 之前没有发生过)。

Oracle 的观点是,因为每个版本仅在前一个版本发布后的 6 个月推出,所以不会有太多新的“东西”,因此升级并不困难。虽然如此,但这不是重点。重要的是升级是否有可能会破坏代码。很明显,从 11 -> 12 -> 13 开始,代码遭受破坏的可能性要大于 8 -> 8u20 -> 8u40。

11 -> 12 -> 13 与 8u20 -> 8u40 等这样的更新主要区别在于对字节码版本的更改以及对规范的更改,对字节码版本的更改往往特别具有破坏性,大多数框架都大量使用与每个字节码版本密切相关的 ASM 或 ByteBuddy 等库。而 8u20 -> 8u40 仍然使用相同的 Java SE 规范,具有所有相同的类和方法,不同于从 Java 12 移动到 13。

除此之外,Oracle 的另一个声明也十分值得我们关注。声明透露出的消息是,如果坚持使用 Java 11 并计划在下一个 LTS 版本(即 Java 17)发布时再进行升级,开发者可能会发现自己的项目代码无法通过编译。所以请记住,Java 新的开发规则现在声明可以在一个版本中弃用某个 API 方法,并在下一个版本中删除它。

采用新版本 Java 的注意事项

在本节中,将概述在采用新版本 Java 之前必须考虑的一些注意事项/风险。

被新版本系列“绑定”

如果采用了 Java 12 并使用新的语言特性或新的 API,这意味着实际上你已将项目绑定到 Java 的新版本系列。接下来你必须采用 Java 13, 14, 15, 16 和 17,并且必须在下一个版本发布后的一个月内采用每个新版本。

使用了新版本,每个版本的使用寿命为六个月,并且在发布后仅七个月就过时了。这是因为每个版本只有在六个月内提供安全补丁,发布后1个月的第一个补丁和发布后4个月的第二个补丁。7个月后,下一组安全补丁会发布,但旧版本不能获取更新。

因此,你要判断自身的开发流程是否允许升级 Java 版本,时间窗口方面会不会太狭窄?

升级的“绊脚石”

实际使用中有很多阻止我们升级 Java 的因素,下面列出一些常见的:

开发资源不足:你的团队可能会非常忙碌或规模太小,你能保证两年后从 Java 15 升级到 16 的开发时间吗?
构建工具和 IDE:你使用的 IDE 是否会在发布当天支持每个新版本?Maven? Gradle 呢? 如果不是,你有后备计划吗?请记住,你只有1个月的时间来完成升级、测试并将其发布到生产环境中。此外还包括 Checkstyle,JaCoCo,PMD,SpotBugs 等等其他工具。
依赖关系:你的依赖关系是否都准备好用于每个新版本?请记住,它不仅仅是直接依赖项,而是技术堆栈中的所有内容。字节码操作库尤其受到影响,例如 ByteBuddy 和 ASM。
框架:这是另一种依赖,但是一个大而重要的依赖。在一个月的狭窄时间窗口内,Spring 会每六个月发布一个新版本吗? Jakarta EE(以前的 Java EE)会吗?如果它们不这样做会怎么样?
云 / 托管 / 部署

你是否可以控制代码在生产环境中的运行位置和方式?例如,如果你在 AWS Lambda 中运行代码,则无法控制。AWS Lambda 没有采用 Java 9或10,甚至没有采用 Java 11。所以除非 AWS 提供公共保证以支持每个新的 Java 版本,否则根本无法采用 Java 12。

如何托管你的 CI 系统?Jenkins, Travis, Circle, Shippable, GitLab 会快速更新吗?如果不是,你会怎么做?

对未来的预测

如果已经阅读了上面的列表,并且你的代码和流程可以应对。这十分好,但更重要的是要明白,你也在限制未来进行改变的能力。例如,你的代码可能今天不在 AWS Lambda 上运行,但未来三年呢?

为采用新版本进行规划

如果正在考虑采用新版本的 Java,建议你准备一份现在所依赖的所有内容的清单,或者可能在未来3年内会依赖的。你需要保证该列表中的所有内容都能正常工作,并与新版本一起升级,或者如果该依赖项不再更新,请制定好计划清单:

Amazon AWS
Eclipse
IntelliJ
Travis CI
Shippable CI
Maven
Maven plugins (compile, jar, source, javadoc, etc)
Checkstyle, 以及相关的 IDE 插件和 maven 插件
JaCoCo, 以及相关的 IDE 插件和 maven 插件
PMD 和相关的 maven 插件
SpotBugs 和相关的 maven 插件
OSGi bundle metadata tool
Bytecode 工具(Byte buddy / ASM etc)
超过 100 个 jar 包依赖项
说了这么多,作者当然不是鼓励大家不进行升级,新语言特性带来的好处以及性能增强会让开发者受益,但升级背后的风险也应该考虑进去。

其他第三方产商的声明

Spring 框架已经在视频中表达了对 Java 12 的策略。关键部分是:

“Java 8 和 11 作为 LTS 版本会持续获得我们的正式支持,对于过渡版本,我们也会尽最大努力支持。如果你升级到 Java 11,我们非常愿意和你合作,但它们不会获得正式的生产环境支持。因为长期支持版本才是我们关注的重心,对于 Java 12 及更高版本我们会尽最大的努力。”

总结

相信肯定已经有开发团队采用了新版本的 Java,但希望他们是经过思考判断之后做出的决定。除了文章中提到的问题,还会有很多其他在升级前需要思考的因素,欢迎在评论中留下你的看法。

**
这里是程序员秘密聚集地,各位还在架构师的道路上挣扎的小伙伴们速来。

加QQ群:611481448

oracle11g驱动包该用哪个

....jarojdbc6.jarojdbc6_g.jarojdbc6dms.jarojdbc6dms_g.jar这几个jar包请问该用哪个驱动版本是11G楼主你好,我在jdk1.6.0_31+tomcat7的环境下,用ojdbc6.jar包,完全木问题。不过oracle11g,好像有release1和release2两个版本,一开始我用release1的版本,用clas... 查看详情

常用的分布式事务都有哪些?我该用哪个?(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来源丨小姐姐味道(ID:xjjdog)原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。分布式的CA... 查看详情

为啥 writeObject 会抛出 java.io.NotSerializableException,我该如何解决?

】为啥writeObject会抛出java.io.NotSerializableException,我该如何解决?【英文标题】:WhydoeswriteObjectthrowjava.io.NotSerializableExceptionandhowdoIfixit?为什么writeObject会抛出java.io.NotSerializableException,我该如何解决?【发布时间】:2012-12-0311:15:30... 查看详情

rust我该用什么软件开发rust|常用支持rust的编辑器推荐

目录一、前言二、编辑器插件1.VSCode2.SublimeText3.IntelliJIDEA(推荐)4.VIM三、以GoLand为例安装rust插件演示1.插件市场搜索rust2.创建项目并Hello,world!四、总结一、前言简单来说,Rust用记事本也能写,但是好工具能大幅... 查看详情

什么是 NullPointerException,我该如何解决?

】什么是NullPointerException,我该如何解决?【英文标题】:WhatisaNullPointerException,andhowdoIfixit?【发布时间】:2020-11-2409:02:12【问题描述】:什么是空指针异常(java.lang.NullPointerException)以及导致它们的原因?可以使用哪些方法/工具来... 查看详情

java学习

...有更新了 前面学的前端早就不知道跑哪去了 其实还是没有坚持 总是三分钟热度 断断续续 然后就很难学习下去了希望今年能坚持下去  最近从java基础学习 老是学完就忘记前面头大 学习的方法... 查看详情

卓越培训:只需五步,让你轻松学好java!

 俗话说磨刀不误砍柴工,无论学习什么语言,都还是要讲究一些技巧,那么如何学Java呢?中软卓越Java培训老师为大家总结快速学习Java的5个步骤,帮你4个月学会Java。  1、确定学习java的决心。万事开头难,其实对于编程来... 查看详情

java日常规范

...  所以建议使用Integer,方便以后拓展。 2.判空时,该用什么什么注解?暴力总结:@NotEmpty用在集合类上面@NotBlank用在String上面@NotNull用在基本类型上如果是对象接收,记得加@Valid 查看详情

PostgreSQL 11 和 12 的 PL/Java 替代方案是啥?

】PostgreSQL11和12的PL/Java替代方案是啥?【英文标题】:WhatisthealternativeofPL/JavaforPostgreSQL11and12?PostgreSQL11和12的PL/Java替代方案是什么?【发布时间】:2021-09-1516:28:22【问题描述】:了解来自:https://www.enterprisedb.com/edb-docs/d/edb-postgres... 查看详情

java基础总结(代码片段)

...工作,深知基础的重要性,即使工作很忙,也还是挤着时间努力输入。有时觉得坚持很难很难,好在自己还是坚持了过来,不过这只是编程路上跨过的小小一步,前路漫漫,吾将持续求索。此篇文章为J 查看详情

Java 9、10、11、12 等中的 javax.smartcardio

】Java9、10、11、12等中的javax.smartcardio【英文标题】:javax.smartcardioinJava9,10,11,12...etc【发布时间】:2018-08-2809:34:32【问题描述】:从Java9开始,javax.smartcardio库发生了什么变化?是否有替代方法或某种方法可以在JAR中获取它?【问... 查看详情

上周热点回顾(12.5-12.11)

...思路篇([email protected])· Java程序员:工作还是游戏,是该好好衡量一下 查看详情

java制作最难练手速游戏,faker都坚持不了一分钟

...s.width=650;"src="%5C"alt=""Java制作最难练手速游戏,Faker都坚持不了一分钟""/>想练手速,来啊,互相伤害啊Java制作最难练手速游戏,目测Faker也坚持不了一分钟制作思路:只靠Java实现。Java、Java、Java、Java、Java、Java、Java、Java... 查看详情

java19正式发布,七大特性齐发,最常用的还是java11

推荐阅读:杀疯了!深圳虾皮光速大裁员!上个厕所的功夫,软件瞬间查无此人。保安开会防止员工跳楼~时隔六个月,9月20日,Java19如期而至,这一版本是自Oracle宣布Java以六个月为一周期发布的第十... 查看详情

2022.12.31

...那样频繁了,也有几个公司走到终面,但是有的还是没拿到offer,不要气馁!我是最棒的!还是坚持每天刷题,已经成为一个习惯了,继续保持!2022年即将过去,2023年来到了,希望2023年顺... 查看详情

一脚踩进java之基础篇12——面向对象

...面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。  例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,... 查看详情

2022.12.31

...那样频繁了,也有几个公司走到终面,但是有的还是没拿到offer,不要气馁!我是最棒的!还是坚持每天刷题,已经成为一个习惯了,继续保持!2022年即将过去,2023年来到了,希望2023年顺... 查看详情

java——零基础速成学习(代码片段)

三天回顾Java——零基础速成实战第二天初识Java入门基础(下)11.网络编程11.1、概述11.2、**网络通信的要素**11.3、IP11.4、端口11.5、通信协议11.5.1**TCPUDP对比**11.6、TCP11.6.1文件上传11.6.2Tomcat11.7、DUP11.7.1发送接收消息11.7.2多... 查看详情