简介:EMT4J 是什么?如何应用 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 11JDK 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/e…—— 完 ——退出龙蜥社群退出微信群:增加社区助理 - 龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;退出钉钉群:扫描下方钉钉群二维码。欢送开发者 / 用户退出龙蜥社区(OpenAnolis)交换,独特推动龙蜥社区的倒退,一起打造一个沉闷的、衰弱的开源操作系统生态!
对于龙蜥社区龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、集体等在被迫、平等、开源、合作的根底上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、凋谢的 Linux 上游发行版社区及翻新平台。龙蜥社区成立的短期指标是开发龙蜥操作系统 (Anolis OS) 作为 CentOS 停服后的应答计划,构建一个兼容国内 Linux 支流厂商的社区发行版。中长期指标是摸索打造一个面向未来的操作系统,建设对立的开源操作系统生态,孵化翻新开源我的项目,凋敝开源生态。目前,Anolis OS 8.6 已公布,更多龙蜥自研个性,反对 X86_64、RISC-V、Arm64、LoongArch 架构,欠缺适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密反对。欢送下载:https://openanolis.cn/download 退出咱们,一起打造面向未来的开源操作系统!https://openanolis.cn 原文链接:https://click.aliyun.com/m/10… 本文为阿里云原创内容,未经容许不得转载。