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博客

相关推荐
一个天蝎座 白勺 程序猿4 分钟前
Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战
开发语言·python
ShiinaMashirol6 分钟前
代码随想录刷题|Day20(组合总数,组合总数2、分割回文串)
java·算法
都叫我大帅哥10 分钟前
代码界的「俄罗斯套娃」:组合模式的嵌套艺术
java·后端·设计模式
写bug写bug14 分钟前
Java并发编程:使用Wait和Notify方法的注意事项
java·后端
jackson凌25 分钟前
【Java学习笔记】键盘录入方法
java·笔记·学习
kfepiza29 分钟前
ServletRequestListener 的用法笔记250417
java·java ee
kfepiza31 分钟前
ServletContextListener 的用法笔记250417
java·java ee
一介输生32 分钟前
Spring Cloud实现权限管理(网关+jwt版)
java·后端
Dcs35 分钟前
使用 OpenRewrite 简化 Java 和 SpringBoot 迁移
java
kfepiza35 分钟前
ServletRequestAttributeListener 的用法笔记250417
java·java ee