EMT4J——让 Java 应用升级更轻松

前言

JDK 升级对于 Java 应用来说是不得不面对的事情,一方面 Java 生态系统希望 Java 应用能跟上最新 JDK 版本:

  • Oracle 建议将 JDK 的 LTS 版本的发布周期从 3 年调整为 2 年,对于只使用 LTS 版本的应用来说,可以在更短时间内使用最新的技术,但这也意味着版本升级会更加频繁。
  • Spring Framework 6 只支持 JDK 17。Spring 是大多数企业级应用依赖的基础框架,意味着不得不升级到 JDK 17。

但是另一方面,现实中的 Java 应用的 JDK 升级较为缓慢。JDK 11 从 2018 年发布近 4 年,已升级 JDK 11 仍未达到半数(2022-state-of-java-ecosystem)。而相比之下,JDK 8 发布之后 1 年内可达到 38%,两年达到 64.3%,到 2018 年时近 80%(java-8-adoption-march-2016、jvm-ecosystem-report-2018)。

那为什么升级 JDK 11 积极性不高呢?

可能的原因是多方面的。例如 JDK 8 在语言层面引入了 Lambda 对开发人员非常有吸引力,而 JDK 11 在语言层面的更新显得可有可无。但是有一点是非常明显的,相比从其它版本升级到 JDK 8(JDK 6/7 升级到 JDK 8 对于应用基本无感),升级到 JDK 11/17 难度会大很多,可能会遇到很多兼容性问题,如:

1、删除了一些 API 如 sun.misc.*导致代码出现 ClassNotFoundException。

2、Java Version 的 Schema 发生变化导致原来判断 Java 版本的逻辑出现异常。

3、用户代码中使用了私有的 API,使用了标记为废弃的 API 等。

4、JPMS(Java Platform Module System)的引入导致一些反射代码会无法工作。

5、删除了 J2EE 相关的包。

如果需要升级的应用依赖了成百上千的二方和三方 jar,而这些 jar 可能也存在兼容性问题,更进一步,如果需要升级的应用几十个甚至几百个,那么带来的额外工作量可想而知。

正是由于上述的困难,阿里巴巴内部将这些升级的经验通过工具沉淀下来,希望能够通过工具帮忙更多的 Java 应用更高效的升级最新版本 JDK。

EMT4J 简介

目前 Eclipse Migration Toolkit for Java(简称“EMT4J”)已经在 Eclipse 社区开源,并通过了 Eclipse Adoptium PMC 评审,作为 Eclipse Adoptium 子项目进行孵化。阿里云也是 Eclipse Adoptium 工作组的战略基石成员,参与 Eclipse Adoptium 社区治理,为 Java Ecosystem 提供完全兼容的、基于 OpenJDK 的高质量 JDK 发行版。

EMT4J 目前支持了从 JDK 8 升级到 JDK 11&17 的分析,后续也会不断的更新对于最新的 LTS 版本的支持。

目前支持通过如下 3 种方式使用:

  • Java Agent
  • 命令行工具
  • Maven插件

EMT4J 架构图如下:

EMT4J——工具使用(场景演示)

以一个常见的场景来说明工具的使用:

开发人员张三接到任务,需要将所在团队负责的 8 个 Java 应用(app-service-1 到app-service-8)从 JDK 8 升级到 JDK 17,那张三在 EMT4J 的帮助下如何升级呢?

具体升级操作我们分以下七步走:

1、张三下载了 EMT4J 工具到本地,并且在 /home/jdk17 本地安装了目标版本的 JDK 17。

2、将 app-service-1~app-service-8 的应用包下载到 EMT4J 所在机器,放在目录 /home/app/deploy,并将 app-service-1~app-service-8 的 JVM 选项放入到 .cfg 的文本文件,放在目录 /home/app/vmoptions。

3、运行工具检查:sh ${EMT4J_HOME}/bin/analysis.sh -f 8 -t 17 -j /home/jdk17 /home/app,其中 -f 8 -t 17 表示从 8 升级到 17, -j /home/jdk17 表示目标版本 JDK 的安装目录,/home/app 表示需要检查的应用包以及参数文件。命令执行完成以后,默认会在当前目录生成 report.html。打开检查报告report.html 查看到问题的列表如下:

4、张三点击"The schema of java version changed in JDK9"查看问题的详情,看到提示如下具体的类:Location: file:/home/app/deploy/app-service-1/notify-utils-2.2.5.jar, Target: com.app.services1.utils.VersionInfo

5、张三打开 app-service-1 的工程看到如下的代码,下面的代码显然是无法处理类似于 17.0.1 版本号。

private final String JAVA_VERSION = System.getProperty("java.version");   
private final int getJavaVersionAsInt() {if (this.JAVA_VERSION == null)return 0; String str = this.JAVA_VERSION.substring(0, 1);str = str + this.JAVA_VERSION.substring(2, 3);if (this.JAVA_VERSION.length() >= 5) {str = str + this.JAVA_VERSION.substring(4, 5);} else {str = str + "0";} return Integer.parseInt(str);
}

6、张三参考报告中的 How to fix 了解到 JDK 9 以后 Java Version 的 Schema 发生了变化,按新的 Schema 修改代码。

7、张三按依次参考报告中对其它问题修改。修改完成以后,在开发机器上使用目标版本 JDK 启动验证功能正确性。

EMT4J——工具特性一览

以上使用 EMT4J 工具帮助张三从 JDK 8 成功地升级到 JDK 17,那么 EMT4J 工具具有哪些特性?

1、支持 Java Agent、命令行工具以及 Maven 插件等方式使用

  • Java Agent 可以获取更多运行时上下文信息,能提供准确调用栈,能发现更多的问题
  • 命令行工具方便使用,无须启动应用,但是可能会存在误报
  • Maven 插件可以集成在构建阶段,可在开发阶段发现问题

2、支持多种潜在不兼容性问题分析

  • JDK 8 到 JDK 11
    • JDK Internal API 的使用
    • System ClassLoader 不再是 URLClassLoader 子类
    • Arrays.asList 返回类型变化
    • Java Version 的 Shema 发生变更
    • JPMS 需要增加 add-exports 和 add-opens
    • 时区数据变更为 CLDR 引起相关不兼容
    • Pattern.compile 的 API 变更
    • JVM 选项变更
    • ...
  • JDK 11 到 JDK 17
    • 删除了 Nashorn
    • 删除了RMI 和 Java Applet
    • 部分 Class 无法反射获取 Field
    • ...

3、支持 HTML、TXT 和 JSON 格式的输出

如何参与贡献?

如果您在使用 EMT4J 的过程中,遇到如下的问题:

  • 工具应该发现的兼容性问题,但是实际没有发现
  • 工具报告的问题上下文不准确,不方便查找问题在哪里
  • 工具报告的问题描述不清晰,难以指导如何修改增加一些新的功能,比如工具支持其它一些格式
  • ...

都可以通过如下的方式参与贡献:

  • 创建 issue 描述您遇到的问题
  • 自己 Fork 以后修改测试后,并通过 PR 合入 master

结语:因为目前还有很多的 Java 应用仍然停留在 JDK 8上,所以这些应用正在规划或者正在升级 JDK 中,希望通过 EMT4J 让我们的升级工作更轻松一些。

我们在工具中沉淀了阿里巴巴升级 JDK 的经验,但是肯定还有很多我们没有遇到的兼容性问题,另外 JDK 新的版本不断会发布,也会不断有新的兼容性问题出来。我们希望通过开源的方式,能够有更多的开发者参与到工具中,给工具不断增强功能,让更多的 Java 应用升级变得更简单。更多内容 (如何使用、贡献等) 可以参考:https://github.com/adoptium/emt4j

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多年锤炼,迈向Kata 3.0 !走进开箱即用的安全容器体验之旅

一、Kata 的过去 让我们将时钟拨回 2015 年 5 月,Hyper.sh 和 Intel 开源技术中心的工程师们分别独立发布了runV 和 Clear Containers 的虚拟化容器项目,而这两个项目便是 Kata Containers1 的前身。这两个项目互相有很多交流,在分别独立发展…

从函数计算到 Serverless 架构

前言 随着 Serverless 架构的不断发展,各云厂商和开源社区都已经在布局 Serverless 领域,一方面表现在云厂商推出传统服务/业务的 Serverless 化版本,或者 Serverless 计算平台,另一方面表现在开源社区中 Serverless 相关项目逐渐…

PolarDB B-tree 并发控制优化

InnoDB 索引 InnoDB 引擎使用索引组织表,每个表的数据都放在一个对应的索引中,该索引称为聚集索引(clustered index),使用索引组织表的目的是: 动态地组织磁盘文件结构,维护数据记录有序&…

几种常见的 MySQL/PolarDB-MySQL 回收表空间方法对比

背景 为什么需要回收表空间?任何一个存储或您购买的实例规格都有容量限制,并且根据存储介质不同,保存方式不同,相应地成本也会不同。在线数据库的存储成本是比较高的,所以架构师和DBA在系统设计之初就要考虑满足未来几…

Lindorm-Operator云原生实践

背景介绍: 随着 Kubernetes 使用的越来越广泛,k8s管理的native的对象资源有时并不能满足用户的需求,为了提高可扩展性,自 v1.7 以来,Kubernetes 引入了 CRD 机制(CustomResourceDefinition)&am…

客户端单元测试实践 — C++篇

背景 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题、提高性能,我们采用了将核心代码C化的策略。 由于团队项目偏底层,测试同学难以完全覆盖,回归成…

基于 RTS 超低延时直播优化强互动场景体验

RTS 在阿里云视频直播的基础上进行底层技术优化,通过集成阿里云播放器 SDK,支持在千万级并发场景下节点间毫秒级延时直播的能力,弥补了传统直播存在 3~6 秒延时的问题,确保了超低延时、低卡顿、秒开流畅的直播观看体验。本文介绍了…

一文详解用 eBPF 观测 HTTP

前言 随着eBPF推出,由于具有高性能、高扩展、安全性等优势,目前已经在网络、安全、可观察等领域广泛应用,同时也诞生了许多优秀的开源项目,如Cilium、Pixie等,而iLogtail 作为阿里内外千万实例可观测数据的采集器&…

面向云时代的龙蜥操作系统,是 CentOS 替代的最佳选择

2022 开放原子全球开源峰会 OpenAnolis 分论坛上,阿里云智能基础软件产品经理张鹏程做了《面向云时代的龙蜥操作系统,应对 CentOS 停服的最佳选择》的主题分享,介绍了操作系统产业迎来新发展格局,龙蜥致力于成为 CentOS 迁移的最佳…

数据库治理利器:动态读写分离

背景 在分布式系统架构中,业务的流量都是端到端的。每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。 对于我们的系统来说,数据库是非常重要的一块。因此无论是在稳…

为什么我要迁移 SpringBoot 到函数计算

为什么要迁移? 我们的业务有很多对外提供服务的 RESTful API,并且要执行很多不同的任务,例如同步连锁 ERP 中的商品信息到美团/饿了么等平台,在线开发票等。由于各种 API 和任务执行的不确定性,经常会因为资源不足导致…

Ingress Nginx 接连披露高危安全漏洞,是否有更好的选择?

今年 K8s Ingress Nginx 项目接连披露了三个高危安全漏洞(CVE-2021-25745[1], CVE-2021-25746[2], CVE-2021-25748[3]),该项目也在近期宣布将停止接收新功能 PR,专注修复并提升稳定性。Ingress Nginx 作为 K8s 项目自带的网关组件…

浅谈数据仓库架构设计

1. 数据中台与DW/BI/DSS 个人认为数据中台本质上是一种新的适配大数据技术发展的新的“数据仓库-决策支持(商业智能)”架构。这个架构是构建在传统的架构基础之上,对传统架构的一种新的发展。 数据中台从企业的视角出发,要求企业…

RocketMQ 消息集成:多类型业务消息 - 定时消息

引言 Apache RocketMQ 诞生至今,历经十余年大规模业务稳定性打磨,服务了 100% 阿里集团内部业务以及阿里云数以万计的企业客户。作为金融级可靠的业务消息方案,RocketMQ 从创建之初就一直专注于业务集成领域的异步通信能力构建。 本篇将继续…

一文读懂 BizDevOps:数字化转型下的技术破局

我们正迈向数字经济时代,数字化转型成为普遍行动。未来绝大多数业务都将运行在数字基座之上,软件系统成为业务创新和发展的核心引擎。在这一趋势下,产品研发的交付能力面临巨大挑战,产品研发的交付实践和方法亟待变革。 BizDevOp…

地址标准化服务AI深度学习模型推理优化实践

导读 深度学习已在面向自然语言处理等领域的实际业务场景中广泛落地,对它的推理性能优化成为了部署环节中重要的一环。推理性能的提升:一方面,可以充分发挥部署硬件的能力,降低用户响应时间,同时节省成本;…

淘系数据模型治理最佳实践

导读:本次分享题目为淘系数据模型治理,主要介绍过去一年淘系数据治理工作的一些总结。 具体将围绕以下4部分展开 模型背景&问题2问题分析3治理方案4未来规划 模型背景&问题 1.整体情况 首先介绍一下淘系的整体数据背景。 淘系的数据中台成立…

【走进RDS】之SQL Server性能诊断案例分析

客户的困扰 前几天某程序员小王向阿里云咨询他的SQL Server数据库整体负载较高,是否有优化的方法?前几天另外一个工单则是需要阿里云工程师帮忙定位某一个时刻的数据库性能尖刺的问题。 这些都是常见的性能诊断工单,其实数据库性能诊断不仅…

用了那么久的 Lombok,你知道它的原理么?

序言 在写Java代码的时候,最烦写setter/getter方法,自从有了Lombok插件不用再写那些方法之后,感觉再也回不去了,那你们是否好奇过Lombok是怎么把setter/getter方法给你加上去的呢?有的同学说我们Java引入Lombok之后会…

Fury:一个基于JIT动态编译的高性能多语言原生序列化框架

Fury是一个基于JIT动态编译的多语言原生序列化框架,支持Java/Python/Golang/C等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。 引言 过去十多年大数据和分布式系统蓬勃发展,序列化是其…