Java17稳妥升级计划「4步超详解」

这篇具有很好参考价值的文章主要介绍了Java17稳妥升级计划「4步超详解」。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

点击蓝字👆 关注Agilean,获取一手干货

最新直播资讯

Adapt 3.0 系列直播精彩继续中,本系列直播推出以来广受好评,许多伙伴咨询我们是否有回放,为了让大家更多参与直播互动,本系列直播暂不设置回放,所以感兴趣的伙伴们不要错过直播啦!快点约起来吧~

导语

作为CTO或系统架构设计师,必须持续探索新技术,以确保企业所使用或开发的信息系统具有长久生命力。

维护稳定的系统至关重要,但长期来看,保持先进性和可靠性才是企业发展的关键。

近年来,微服务、容器化、云原生等基础设施或架构设计不断更新迭代,对Java技术体系带来新的挑战,同时也迫使Java加快了更新步伐以适应新的环境与需求。

目前许多企业仍将Java 8作为首选的信息系统开发编程语言,然而我们必须注意到,Java 8已经面临支持结束的阶段。在这个时间节点上,我们应认真考虑Java 17升级计划,做好必要的调研与对策。

基础开源软件的维护周期大约是5-10年

持续迭代更新,是开源软件能保持生命力的重要原因。

如果我们考察几个与Java密切相关的开源软件,就会发现它们设置的长期支持计划(long term support,LTS)大约在5年左右。

1. Linux,6年

可以从Linux内核的开发时间表上看出每个LTS版本维护期大约是6年。

Java17稳妥升级计划「4步超详解」

图片来源:Wikipedia/Linux_kernel_version_history

2. Spring Framework,5年

Spring Framework是Java企业应用开发常用框架之一,从2.x版本(2006年)开始就保持一个相对固定的迭代周期,每个大版本保持约5年的更新维护期。

Java17稳妥升级计划「4步超详解」

3. Spring Boot,5年

Spring Boot保持了和Spring Framework相似的更替周期。

1.0正式发布于2014年,1.x最后一个版本1.5.x发布于2018年,免费支持到2021年。

2.0发布于2018年,当前版本是2.7,免费支持到2024年。3.0发布于2022,最低要求是Java17。2.x距今已经有4年,估计2.7可能是最后一个版本,但应该会延长支持(安全修复)以方便过渡到3.x。

Java17稳妥升级计划「4步超详解」

图片来源:spring.io

Java8之后Oracle调整了发版规则与授权协议

再详细讲一下Java的情况,Java8以及之前的版本,保持平均2年一个小升级的节奏(Java 1.0 1996年——1.8 2014年),兼容与稳定带来Java平台的繁荣发展。

2009年Oracle收购Sun公司,Java转移到Oracle名下。2020年时,Oracle变更Java授权协议,开始区分免费与商用。 

简单讲 Oracle JDK8 2020年(Oracle_JDK_180_202)的版本可以自由使用,2020以后的版本若用于商业用途需要付费,最终支持到2030年。

另外从Java9开始,更新节奏加快。OpenJDK会保持6个月一个版本的节奏,大约每隔3年会发布一个长期支持版版的Open JDK(这意味着8之后稳定版是11、17)。Oracle也会相应的发布LTS的Oracle JDK,一个版本维护约5年,超期要购买付费支持。

参考:https://www.oracle.com/java/technologies/java-se-support-roadmap.html

Java版本升级之所以加快,也是受到新兴技术、新编程语言的影响,担心Java技术栈落后于人。

必须再提一下OpenJDK,这是Java平台(J2SE)的参考实现,也是开源(GPL)且自由使用的JDK。Oracle JDK也是在OpenJDK基础上添加专有组件和商业支持后的版本。目前业界普遍倾向优先使用OpenJDK来避免Oracle JDK License的限制。

Java17升级路线

为了让读者们快速、清晰地了解如何顺利地升级到Java17,笔者整理出以下4个步骤:

第一步

  解决OpenJDK8 Runtime的兼容性问题

首先,应当解决OpenJDK8的兼容性问题。

建立OpenJDK8的运行环境,在其中启动程序来识别兼容性问题。

相对来说,从Oracle JDK迁移到OpenJDK应该是完全兼容的,但现实中往往打脸。首先保持与OpenJDK 8的无缝切换可以为后续升级打下基础。

你可能会遇到的问题及解决办法:

01

存在对Oracle JDK的特殊条件判断

可通过调整代码解决,不应该再对JDK的供应商做判断了

02

对专有package 的引用

例如com.sun.*, sun.misc.*,可替换成相同功能的开源组件或者使用Java提供的正式接口

03

缺少个别library(例如javafx,javax*)

可通过引入依赖项解决,这些依赖原本就不是JDK的一部分

完成这一步,可以让程序摆脱 Oracle JDK 的专有依赖,是后续工作的基础。

小贴士:

以下链接提供了工具,可以帮忙做静态分析,以识别现有问题:https://developers.redhat.com/blog/2019/01/09/using-red-hat-application-migration-toolkit-to-see-the-impact-of-migrating-to-openjdk

第二步

  解决Java17 Runtime 兼容性问题

建立 Java17 的运行环境,在新环境中尝试启动程序识别运行时兼容性问题,这一步不会改变程序的编译设置。

得益于Java的兼容性设计,旧版Java代码理论上可以无差错地在新版环境中运行。即便遇到问题,也是相对容易解决的。

你可能会遇到的问题及解决方法:

01

JVM启动参数不再支持

此时应当更换新启动参数

02

硬编码的Java版本判断导致启动异常

在源代码中补充完善判断条件

03

字节码处理模块异常

例如:asm、cglib、lombok,一般将类库升级到更高的兼容版即可。对于使用了依赖管理的程序,这一步容易操作,如果你的程序还在使用直接jar依赖构建,你应该先考虑迁移到使用Maven管理依赖。

04

访问的接口不存在

例如javax.*、javafx.*,只需要在依赖声明中,添加对应API的包

05

其他异常

通常比较少见,一般是程序处理上没有使用标准的方式,依赖了某种 JRE 特定行为所致。相应的类库应当升级或者更改代码处理逻辑。

完成这一步,程序既不用改变开发环境,又有了对高版本运行环境的兼容性。即便你不打算立即使用Java17新功能进行开发,这么做也是值得的

第三步

  解决Compile Time 兼容性问题

此时,升级开发环境到 JDK17 ,但编译目标仍然保持为8,开始解决编译问题。这一步也是最为困难的。

可能出现的问题及解决办法:

01

类找不到

这种情况在之前的步骤中已经排除大半,继续识别依赖升级即可。

02

编译错误

依赖注解处理、字节码生成、代码生成工具的编译辅助工具可能会报错,需要升级这些工具的版本。

03

测试套件(Junit)报错

自动化测试的错误需要逐个处理。也可能是是框架在反射调用上有变化,统一处理一次就好。

04

编译通过了但启动异常

大概率在异常处理,判断逻辑上有过时用法,与第二个阶段中提到的处理方式一样。

05

组件还没有支持17的版本

这时可先升级到 JDK11 来过渡,如果组件连没有兼容JDK11的版本都没有,那可能要考虑更换这个组件或暂缓第三步工作。

可能还会遇到其他问题,这个也是大家最为担心而不愿意主动升级的原因。这时候平常积累的自动化测试套件、全量的回归案例、性能测试套件就应该派上用场了。执行这些测试套件来验证软件仍在按期望工作。

第四步

  完全升级到 Java17

在成功完成前面三个步骤之后,第四步是更改 compile target 为17,使用语法的新功能。

此处摘录新功能中较为重要的一些供参考:

JDK11:

  • 对TLS1.3加密的支持,JEP 332: Transport Layer Security (TLS) 1.3  

  • 用var关键词声明局部变量,JEP 323: Local-Variable Syntax for Lambda Parameters

  • JEP 327: Unicode 10

  • 新GC算法,JEP 333: ZGC: A Scalable Low-Latency Garbage Collector

JDK14:

  • 精确提醒空指针异常位置, JEP 358: Helpful NullPointerExceptions

  • Switch 可使用表达式,JEP 361: Switch Expressions

JDK15:

用三引号写多行字符串不必再转义:JEP 378: Text Blocks

JDK16:

  • 减少JDK体积方便容器构建:JEP 386: Alpine Linux Port

  • JEP 387: Elastic Metaspace JDK

  • 新类型record(与class、enum并列):JEP 395: Records

JDK17:

封口类:JEP 409: Sealed Classes

想进详细了解的朋友可以参考以下链接:https://www.zhihu.com/question/513873484/answer/2328624634

小结

本文提供了一个稳妥的分步骤实施策略,一至四步你可以在任一步骤后安全暂停,而无需全部一次性完成。

实际实施时,还可以根据程序修改的活跃程度以及使用的技术栈的新旧程度来制定不同目标的计划:

Java17稳妥升级计划「4步超详解」

总之,保持基础框架合适的升级换代周期是一个明智的决策。

停止支持的软件就像长期无人居住的房屋一样,最终将面临缺陷修复困难、安全漏洞逐年增加、不支持新的安全算法和协议等问题。

参考资料

工具

[1] Oracle JDK Migration Guide(8-11),Oracle自己整理的Java升级指导,https://docs.oracle.com/en/java/javase/11/migrate/index.html

[2] Eclipse Migration Toolkit for Java ,升级或迁移到OpenJDK的源码检查工具,https://projects.eclipse.org/projects/adoptium.emt4j

[3]  Using Red Hat Application Migration Toolkit to see the impact of migrating to OpenJDK,Red Hat提供的OpenJDK迁移工具https://developers.redhat.com/blog/2019/01/09/using-red-hat-application-migration-toolkit-to-see-the-impact-of-migrating-to-openjdk

专家的观点:

[1] https://mp.weixin.qq.com/s/HJrOf8CjxEJLrvWC9eLn5g ,阿里云 李三红:Java版本升级需要纳入到可持续性维度,51CTO专访,2022

[2] https://mp.weixin.qq.com/s/IaUQrkxvaeEjujDe5-DVfA,从JDK8飞升到JDK17,再到未来的JDK21,“JDK的升级是必然趋势”,唐岳平(凌力), 阿里开发者,2022

本文作者|雷晓宝 Agilean资深技术顾问

Java17稳妥升级计划「4步超详解」

Java17稳妥升级计划「4步超详解」文章来源地址https://www.toymoban.com/news/detail-407412.html

到了这里,关于Java17稳妥升级计划「4步超详解」的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务 Spring Cloud 2021 Spring Boot 2.7.x Java JDK8升级到JDK17研究

    项目正在使用jdk8 如果要升级到jdk17 则需要升级springboot版本及springcloud版本 (springcloud版本和springboot版本必须匹配 要一块升级) 。目前使用的版本如下: spring boot 版本为 2.1.5.RELEASE spring cloud 版本为 Greenwich.SR2 spring 版本为 5.1.7.RELEASE jdk 由 8 升级到 17 spring boot 由 2.1.5.RELEASE

    2024年02月01日
    浏览(56)
  • 同步推送?苹果计划本月推出 iOS17和iPadOS17,你的手机支持吗?

    据报道,苹果公司计划在本月推出 iOS 17 和 iPadOS 17 正式版更新。与去年不同的是,这次更新将同时发布,而不是分别发布。根据彭博社的一位消息人士马克・古尔曼的说法,苹果公司认为 iOS 17 和 iPadOS 17 的第八个测试版已经非常接近最终版本,除非有意外情况发生,否则将

    2024年02月09日
    浏览(39)
  • 拥抱变化,面向Java17,Java8-18全系列特性详解

    文章目录: Java 8 新特性 Java 9 新特性 Java 10 新特性 Java 11 新特性 Java 12 新特性 Java 13 新特性 Java 14 新特性 Java 15 新特性 Java 16 新特性 Java 17 新特性 Java 18 新特性 💡 文章较长,建议点赞、收藏、评论后慢慢看,合理利用 “ 只看目录功能 ” 当我们大部分Javaer还沉浸在Java 8 的

    2024年01月16日
    浏览(42)
  • Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通Golang》 — Go语言学习之旅! 领域矩阵 : 🌐 猫头虎技术领域矩阵 : 深入探索

    2024年02月15日
    浏览(100)
  • 如何升级iOS17/iPadOS17公测版?iOS17公测版升级教程

    苹果官方发布了iOS 17/iPadOS 17系统首个公测版更新,其版本号及更新内容与iOS 17 beta 3一致,版本号为21A5277j。 对于想升级iOS 17/iPadOS 17 公测版的用户,可以参考本教程进行操作。 升级注意事项: 1. 为防止意外情况,在升级之前,请提前备份好设备内的所有数据。 2. 在升级之后

    2024年02月16日
    浏览(37)
  • 简单解决win11预览体验计划空白,升级最新版本Canary频道

    最近突然发现win11的预览计划打开什么都没有了,如下图所示: 在网上找了许多方法,很多并不能完全生效。 下面的是我认为比较简单有效的种解决办法:  准备文件蓝奏云  Win11预览计划Canary频道.zip - 蓝奏云 文件大小:184.5 K| https://wwga.lanzoum.com/iMmI00psncqf 1、打开开始菜单

    2023年04月25日
    浏览(60)
  • 八月更新 | CI 构建计划触发机制升级、制品扫描 SBOM 分析功能上线!

    点击链接了解详情 这个八月,腾讯云 CODING DevOps 对持续集成、制品管理、项目协同、平台权限等多个产品模块进行了升级改进,为用户提供更灵活便捷的使用体验。以下是 CODING 新功能速递,快来看看是否有您期待已久的功能特性: 在原有代码变更及合并请求触发规则基础上

    2024年02月11日
    浏览(35)
  • springboot升级到3.x + jdk升级到17

    jdk由 1.8 升级到 17 spring-boot由 2.7.6 升级到 3.1.2 版本 spring-cloud-alibaba由 2021.0.4.0 升级到 2022.0.0.0-RC2 版本 maven构建插件里的配置要改为17: javax相关的包要改为jakarta: Spring Boot3.0已经将依赖项从Java EE迁移到Jakarta EE API(主要是避免Oracle 的版权问题),所以要将项目中的 javax.se

    2024年02月02日
    浏览(38)
  • Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解(最新版安装包点击文末名片免费获取)

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通Golang》 — Go语言学习之旅! 领域矩阵 : 🌐 猫头虎技术领域矩阵 : 深入探索

    2024年02月02日
    浏览(105)
  • 升级iOS 17测试版后如何降级?iOS17降级教程

    对于已经升级到 iOS 17 测试版的用户,如果在体验过程中,感觉到并不是那么稳定,例如出现应用程序不适配、电池续航下降、功能无法正常启用等问题,想要进行降级操作,可以参考本教程。 降级前注意事项: 1.由于 iOS 系统限制,降级操作时无法直接保留数据,否则刷机

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包