EMT4J—— Java 版本迁移检测工具

最近因为工作需要研究了emt4j,这里写一篇文章记录一下。

非专业Java er,有不同意见欢迎评论区分享。

目录

EMT4J是什么?

如何使用?

Command-line

[Java Agent](#Java Agent)

简单的源码分析

目录分析

规则解析

参考资料


EMT4J是什么?

E clipse M igration T oolkit f or Java (EMT4J)是阿里开发的一款用于Java版本迁移的检测工具,目前已经捐献(开源)给Eclipse社区。

工具支持从 JDK 8 升级到 JDK 11&17 的分析。

github地址 EMT4J在Eclipse的地址

如何使用?

目前有以下三种使用方案:

  1. Java Agent

  2. Command-line

  3. Maven Plugin

没有用过第三种,所以这里只介绍第二种和第一种的用法。

我们先去github的release里面下载最新的v0.8.0的zip,然后解压。

使用的系统环境是Ubuntu2004。

Command-line

解压出来bin目录中有一个名为`analysis`的脚本,Command-line就是用这个脚本进行检测。

这个脚本可以用于检测class,jar包,以及目录

这里我们以检测class:DeprecatedAPIExample.class,从8升级到17版本为例:

bash 复制代码
bash ../emt4j-0.8/bin/analysis.sh -f 8 -t 17 -o report.html DeprecatedAPIExample.class

检测结果有支持HTML、TXT和JSON三种格式,我们这里测试的是html格式。

ps:检测结果的title我自己改过,和正常测出来的结果不一样。

Java Agent

这里还是检测DeprecatedAPIExample.class,从8升级到17版本,测试语句如下:

bash 复制代码
java -javaagent:./emt4j-0.8/lib/agent/emt4j-agent-jdk8-0.8.jar=to=17,file=jdk8to17.dat  DeprecatedAPIExample

会生成jdk8to17.dat,需要再进行一步处理:

bash 复制代码
bash emt4j-0.8/bin/analysis.sh -p txt -o report.txt jdk8to17.dat

这样我们就获得了检测结果report.txt。

简单的源码分析

目录分析

下载EMT4J的源码之后,解压可以看到如下几个目录,这就是项目的几个主要模块。

|----------|--------------------------|
| 目录名 | 功能 |
| bin | Command-line检测的脚本 |
| agent | Java Agent检测的相关代码 |
| assembly | 项目编译结果的存放处 |
| common | Command-line检测的相关代码+资源文件 |
| plugin | Maven Plugin检测的相关代码 |
| test | 自测的代码,用户用不到 |
| jenkins | 一些项目配置 |

规则解析

迁移的规则是以xml的格式存在的,比如8到11的迁移规则存在于以下路径:

bash 复制代码
/emt4j/emt4j-common/src/main/resources/default/rule/8to11/rule.xml

这里选择getFirstDayOfWeek来解析一下规则的构成;

属性 功能
desc 规则描述
type 本来是用来定位规则的实现在哪个类。 不过这个xml里有好多type="whole-class"的,所以具体的实现不通过whole-class来定位
mvel2-rule-file 规则的配置文件名,一般后缀为cfg。 在项目里"如何检测"和"检测哪些内容"一般是分开的,"检测哪些内容"是通过cfg配置文件决定的。
static-analysis-rule 实现"如何检查"的类,也是实际的规则名
result-code 检查结果的配置文件,像这个文件里对应的是CLDR_CLDR_FIRSTDAY_OF_WEEK.properties和CLDR_CLDR_FIRSTDAY_OF_WEEK_zh.properties。 如果你用中文系统,最后检测的结果会显示_zh.properties的内容。
support-modes 支持的检测模式。 class 支持表示Command-line和plugin检测,agent 支持表示Java Agent检测。 可以同时支持这两种检测,检测方法不能共用的话要写新的。
priority 问题错误等级,从p1到p4。 输出检测结果的时候可以指定输出哪个等级的错误。

以上属性不是每个规则都有的,一定有的是desc,type,result-code,mvel2-rule-file或者class-list-file,support-modes,priority。

参考资料

一个简化 Java 应用升级的开源项目:EMT4J-CSDN博客

【精选】当老板让我从 Java8 升到 Java11_jdk1.8升级成jdk11_heern的博客-CSDN博客

相关推荐
myNameGL3 分钟前
下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目
java·ide·intellij-idea
froginwe117 分钟前
WebPages PHP:深入解析PHP在网页开发中的应用
开发语言
Emotion亦楠23 分钟前
Java 学习笔记:常用类、String 与日期时间处理
java·笔记·学习
R-G-B44 分钟前
【33】C# WinForm入门到精通 ——表格布局器TableLayoutPanel【属性、方法、事件、实例、源码】
开发语言·c#·c# winform·表格布局器·tablelayoutpane
郝学胜-神的一滴1 小时前
Spring Boot Actuator 保姆级教程
java·开发语言·spring boot·后端·程序人生
赵英英俊1 小时前
Python day31
开发语言·python
jiangxia_10242 小时前
面试系列:什么是JAVA并发编程中的JUC并发工具类
java·后端
程序员-Queen2 小时前
RDQS_c和RDQS_t的作用及区别
c语言·开发语言
草莓爱芒果2 小时前
Spring Boot中使用Bouncy Castle实现SM2国密算法(与前端JS加密交互)
java·spring boot·算法
慕y2742 小时前
Java学习第九十三部分——RestTemplate
java·开发语言·学习