EMT4J详细介绍与使用,帮你找到Java版本升级带来的问题,让你在项目jdk升级不在头疼

news2024/9/21 18:58:37

Java版本升级带来的问题

前因

java更新迭代速度巨快无比,Spring Framework 6 等项目已经至少需要 Java 17。但是,对于 Java 版本的采用是相对缓慢的。例如,在 Java 11 发布四年之后(2022年),只有不到 49%的 Java 应用在使用11版本。

但是:例如Spring Framework 出现了性能极高的优化,甚至其他框架也出现了里程碑式优化,那面就升级Java版本带来的优势是大于弊端的

后果

将应用升级至新的 Java 版本,意味着开发人员需要解决 Java 内部变更和功能移除所带来的所有问题。这涉及的功能包括 Nashorn、J2EE 和 Java 等包的移除、API 的变更以及对 Java 内部访问更严格的限制。盲目的升级至新的版本,很有可能造成应用中断等不可控因素。

问道包括但不局限于:

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

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

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

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

5、删除了 J2EE 相关的包。

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

版本升级问题案例

Java8 -> Java11 升级中API的变化如下

DK 11中删除的各个API
类/方法被删除附加说明/参考
java.lang.Runtime.runFinalizersOnExit(boolean)危险运行FinalizersOnExit 弃用Java的终结器
java.lang.SecurityManager.checkAwtEventQueueAccess()安全管理器和Java SE JDK JDK-8177554 JDK-8029886 JDK-8186535
java.lang.SecurityManager.checkMemberAccess(java.lang.Class,int)
java.lang.SecurityManager.checkSystemClipboardAccess()
java.lang.SecurityManager.checkTopLevelWindow(java.lang.Object)
java.lang.System.runFinalizersOnExit(boolean)危险运行FinalizersOnExit 弃用Java的终结器
java.lang.Thread.destroy()线程方法destroy()和stop(Throwable)在JDK 11中删除
java.lang.Thread.stop(java.lang.Throwable)
从Java 11中删除模块级API
名称模块已卸下潜在的第三方更换
JavaBeans激活框架 (JAF)java.activationMaven神器
通用对象请求代理体系结构 (CORBA)java.corba玻璃鱼-科尔巴
下表中列出的其他模块的聚合器模块java.se.ee
Java交易API (JTA)java.transactionMaven神器
XML绑定的Java体系结构 ( JAXB )java.xml.bindMaven神器
XML Web Services的Java API (JAX-WS)java.xml.wsMaven神器
常用注释java.xml.ws.annotationMaven神器

java.lang.Thread.stop(java.lang.Throwable) API 为例,演示版本升级带来危害。

简单的SpringBoot项目

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("/testemt")
    public String testEmt(){
        Thread thread = new Thread();
        try{
            thread.stop(new Exception());
        } catch (UnsupportedOperationException e){
            System.out.println( "捕获UnsupportedOperationException " + e);
            return "error !";
        }
    
        return "success !";
    }
}

Java8

在jdk 1.8版本中 ,项目会正常运行没有问题,同时可以捕获异常

img

img

升级到Java11

如果升级到 jdk 11 版本 ,首相项目就会报错,因为 11 版本已经没有java.lang.Thread.stop(java.lang.Throwable)这个方法了。

img

再次访问方法的既定URL 会报错,应用产生中断报错

img

后台日志会打印没有 java.lang.Thread.stop(java.lang.Throwable)方法的error日志

img

版本升级应对方案

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

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

  • Maven插件 可以在开发阶段就发现问题
  • 命令行工具 无需启动应用,但可能存在误报
  • Java Agent 可以获取项目运行时上下文,获取调用栈,报表信息更准确

EMT4J 官网中详细记录三种使用方案

EMT4J: https://github.com/adoptium/emt4j#use-the-emt4j-agent

下面仅列出Maven插件使用方法

将以下配置添加到 pom.xml(如果是多模块项目.xml根 pom):

<build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.emt4j</groupId>
            <artifactId>emt4j-maven-plugin</artifactId>
            <version>0.7.0</version>
            <executions>
                <execution>
                    <phase>process-test-classes</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <fromVersion>8</fromVersion>
                <toVersion>11</toVersion>
                <outputFile>report.html</outputFile>
            </configuration>
        </plugin>
    </plugins>
</build>

然后运行以下命令:

$ mvn process-test-classes

EMT4J的报告将在项目目录中生成。


用户也可以直接运行以下命令,无需修改pom.xml:

# 通过默认配置运行

$ mvn process-test-classes org.eclipse.emt4j:emt4j-maven-plugin:0.7.0:check

# 通过 -D 指定文件来执行

 $ mvn process-test-classes org.eclipse.emt4j:emt4j-maven-plugin:0.7.0:check -D outputFile=emt4j-report.html -D priority=p1

配置:

  • fromVersion:项目当前使用的 JDK 版本。支持 8 和 11,默认支持 8。
  • toVersion:目标 JDK 版本。支持 11 和 17,默认为 11。
  • outputFile:EMT4J报告的目的地。默认值为报表.html。
  • priority:最低规则优先级。支持 P1、P2、P3 和 P4。未设置默认值。
  • verbose:如果为 true,则打印更详细的消息。

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

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

相关文章

[C语言]操作符

目录 1.操作符分类 2.算术操作符 3.位移操作符 3.1左移操作符 3.2右移操作符 4.位操作符 4.1’&‘&#xff08;按位与&#xff09; 4.2’|‘&#xff08;按位或&#xff09; 4.3‘^’&#xff08;按位异或&#xff09; 5.赋值操作符 5.1复合赋值符 6.单目操作…

IDEA搭建Finchley.SR2版本的SpringCloud父子基础项目-------Hystrix断路器

1.1分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免地失败。 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其它的微服务&#xff0…

高薪前端都应该具备的开发好习惯

格拉德威尔曾提出过一个“一万小时定律”&#xff0c;即任何人从平凡到大师的必要条件&#xff0c;就是历经1万小时的锤炼&#xff0c;而这“1万小时”也不是达到就行&#xff1b;如何构成&#xff0c;才是能否成为行业资深的关键。总结起来&#xff0c;就是四个字&#xff1a;…

Databend 开源周报 第 77 期

Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Meta 使用 expressin::TableSch…

蓝桥杯单片机快速得奖方法(分享一些实用技巧)

文章目录前言一、蓝桥杯单片机痛点1.LED灯微亮2.数码管微亮3.蜂鸣器乱叫4.驱动程序不会写5.按键程序灵敏度低容易误操作6.矩阵按键代码总是记不住一写就忘记7.使用大量延时函数导致程序运行效率低下二、痛点解决方法1.锁存器的错误操作2.代码不熟练3.没有高效的代码总结前言 又…

微信小程序 java python django加油站服务系统

目 录 摘 要 I ABSTRACT II 第一章 绪 论 1 1.1选题背景 2 1.2研究现状 3 1.3研究内容 7 第二章 开发工具及关键技术介绍 8 2.1微信开发者工具 8 2.2小程序框架以及目录结构介绍 8 第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 1…

Appium是如何工作的

Appium是由node.js开发的开源自动化测试工具&#xff0c;可用来测试移动端的Native、Hybrid和移动Web应用&#xff0c;被测平台包括Android和iOS&#xff08;最近宣称已支持Windows&#xff09;。 Native apps – 使用Android、iOS和Windows SDK开发的应用。 Mobile web apps …

存储区域网络将占下一代数据存储市场的 7%

根据 Future Market Insights 的最新行业分析&#xff0c;全球存储区域网络 (SAN) 市场预计将显示稳定的增长机会&#xff0c;在 2022 年至 2029 年的评估期内复合年增长率约为 3.9%。 2021 年全球市场估值达到 195.76 亿美元&#xff0c;到 2029 年将进一步扩大至 268.67 亿美…

车载以太网 - SomeIP测试专栏 - SomeIP Entry - 04

前面总纲内容有说,车载以太网中的SomeIP内容是非常多的,并且为了实现SOA的相关需求,提供了多种多样的报文类型,因此也就有了今天要说的SomeIP-SD中的重要组成部分之一的条目(Entry)部分,而SomeIP-SD在车载网络中占有相当大的比重,可以当做是一定要实现的,如果这块不实…

实现自己的数据库四

一前言上一篇已经说明了B树的一些原理&#xff0c;也讲到&#xff0c;我们目前采用的持久化数据的方式&#xff0c;而且我们是单独的插入数据&#xff0c;没有任何元数据信息&#xff0c;虽然插入的速度很快&#xff0c;因为是采用追加的方式。但是这种方式插入速度很快&#x…

Pd1 药物研发进展|销售数据|市场规模|竞争格局|前景分析

Programmed Death-1 (PD-1; CD279) 是一种在活化 T 细胞中诱导的抑制性受体&#xff0c;作为多种癌症的一线治疗药物。然而&#xff0c;严重的免疫相关不良反应限制了PD-1/PD-L1单克隆抗体的临床应用&#xff0c;尽管其疗效良好。 也迫切需要开发针对 PD-1/PD-L1 轴的新型抑制剂…

Torch 论文复现:Vision Transformer (ViT)

论文标题&#xff1a;An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 从 TPUv3-core-days 可以看到&#xff0c;ViT 所需的训练时间比 ResNet 更短&#xff0c;同时 ViT 取得了更高的准确率 ViT 的基本思想是&#xff0c;把一张图片拆分成若干个…

Paddle入门实战系列(四):中文场景文字识别

✨写在前面&#xff1a;强烈推荐给大家一个优秀的人工智能学习网站&#xff0c;内容包括人工智能基础、机器学习、深度学习神经网络等&#xff0c;详细介绍各部分概念及实战教程&#xff0c;通俗易懂&#xff0c;非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…

每日学术速递1.31

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 今天带来的arXiv上最新发表的3篇NLP论文。 Subjects: cs.CL、cs.AI、cs.DB、cs.LG 1.Editing Language Model-based Knowledge Graph Embeddings 标题&#xff1a;编辑基于语言模型的知识图谱嵌入 作…

C语言求幂运算——奇特中文变量命名

写在前面 主要涉及C/C趣味编程应用及解析面向初学者撰写专栏&#xff0c;个人代码原创如有错误之处请各位读者指正&#xff0c;各位可以类比做自己的编程作业请读者评论回复、参与投票&#xff0c;反馈给作者&#xff0c;我会获得持续更新各类干货的动力。 致粉丝&#xff1a;…

【Rust】8. 包、Crate 和 模块管理(公有、私有特性)

8.1 包和 Crate 8.1.1 基本概念 crate 是 Rust 在编译时最小的代码单位&#xff1b;crate 有两种形式&#xff1a;二进制项&#xff08;可以被编译为可执行程序&#xff09;和库&#xff08;没有 main 函数&#xff0c;也不会编译为可执行程序&#xff0c;而是提供一些诸如函…

Selenium+Java+Maven(12):引入Allure作为报告生成器

一、前言 本篇作为SeleniumJava系列的补充&#xff0c;讲了如何使用Allure作为测试报告生成器&#xff0c;来替代TestNG自带的测试报告或ReportNG测试报告&#xff0c;生成更加美观的&#xff08;领导更喜欢的&#xff09;测试报表。话不多说&#xff0c;一起来学习吧~ 二、A…

蒙特卡洛算法详解

蒙特卡洛算法是20世纪十大最伟大的算法之一&#xff0c;阿法狗就采用了蒙特卡洛算法。 1、定义 蒙特卡洛方法也称为 计算机随机模拟方法&#xff0c;它源于世界著名的赌城——摩纳哥的Monte Carlo(蒙特卡洛)。 它是基于对大量事件的统计结果来实现一些确定性问题的计算。其实…

什么是独立性?如何提高独立性?

独立是每个人必经的成长阶段&#xff0c;也是实现人生价值最重要的途径。没有独立就不能实现真正意义上的人生。独立是我们克服困难、实现抱负的最重要的精神力量&#xff0c;也是我们收获幸福的保障。1、什么是独立性&#xff1f;独立性是意志指不受他人影响、能够独立解决问题…

迟到两年的求职总结经验分享

迟到两年的求职总结&经验分享 写在前面 ​ 号主于2021年3月-2021年9月断断续续参加了校园招聘&#xff0c;包括但不限于&#xff1a;暑期实习、秋招提前批、秋招正式批。收获offer包括但不限于&#xff1a;某互联网推荐算法工程师、某通讯公司数据挖掘工程师、某金融科技…