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

相关推荐
无限的鲜花36 分钟前
反射(原创推荐)
java·开发语言
IT二叔1 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
yongche_shi1 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he1 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
超级数据查看器2 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
AI行业学习2 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
折哥的程序人生 · 物流技术专研3 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai3 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
大圣编程3 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
硕风和炜3 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集