最近因为工作需要研究了emt4j,这里写一篇文章记录一下。
非专业Java er,有不同意见欢迎评论区分享。
目录
[Java Agent](#Java Agent)
EMT4J是什么?
E clipse M igration T oolkit f or Java (EMT4J)是阿里开发的一款用于Java版本迁移的检测工具,目前已经捐献(开源)给Eclipse社区。
工具支持从 JDK 8 升级到 JDK 11&17 的分析。
如何使用?
目前有以下三种使用方案:
-
Java Agent
-
Command-line
-
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。