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

相关推荐
记得开心一点嘛2 分钟前
Nginx与Tomcat之间的关系
java·nginx·tomcat
界面开发小八哥15 分钟前
「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
java·前端·ide·java-ee·myeclipse
数据小小爬虫16 分钟前
Python爬虫获取AliExpress商品详情
开发语言·爬虫·python
小爬虫程序猿16 分钟前
利用Python爬虫速卖通按关键字搜索AliExpress商品
开发语言·爬虫·python
王伯爵17 分钟前
<packaging>jar</packaging>和<packaging>pom</packaging>的区别
java·pycharm·jar
一朵好运莲23 分钟前
React引入Echart水球图
开发语言·javascript·ecmascript
Eiceblue36 分钟前
使用Python获取PDF文本和图片的精确位置
开发语言·python·pdf
Q_192849990640 分钟前
基于Spring Boot的个人健康管理系统
java·spring boot·后端
xianwu54344 分钟前
反向代理模块。开发
linux·开发语言·网络·c++·git
xiaocaibao7771 小时前
Java语言的网络编程
开发语言·后端·golang