首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一个简化 Java 应用升级的开源项目:EMT4J

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

作者头像
程序猿DD
发布2023-02-24 15:12:54
发布2023-02-24 15:12:54
9120
举报
文章被收录于专栏:程序猿DD程序猿DD

来源:InfoQ,作者 | Johan Janssen、译者 | 张卫滨、策划 | 丁晓昀

Adoptium 发布了 Eclipse Migration Toolkit for Java(EMT4J),这是一个开源的 Eclipse 项目,能够分析和升级应用的 Java 版,以便于从 Java 8 升级至 Java 11,从 Java 11 升级至 Java 17。EMT4J 将支持升级到未来的 LTS 版本。

很多组织都建议使用最新的 Java 运行时,以获取安全性和功能方面的改进。同时,长期支持(Long Term Support)的 Java 版本每两年发布一次,Spring Framework 6 等项目已经至少需要 Java 17。令人遗憾的是,新 Java 版本的采用是相对缓慢的。例如,在 2022 年,也就是 Java 11 发布四年之后,只有不到 49% 的 Java 应用在使用该版本。

将应用升级至较新的 Java 版本意味着开发人员需要解决 Java 内部变更和功能移除所带来的所有问题。这涉及的功能包括 Nashorn、J2EE 和 Java 等包的移除、API 的变更以及对 Java 内部访问更严格的限制。

EMT4J 提供了一个支持 Maven 插件(目前在 Maven 中央仓库尚不可用)、Java 代理以及命令行的解决方案,以便于分析项目与新版本 Java 的不兼容性,结果会以 ** TXT、JSON  HTML** 格式输出。

为了演示 EMT4J,考虑如下的样例应用,它调用了 Java 11 中已经删除的 ** Thread.stop() **方法:

代码语言:javascript
复制
Thread thread = new Thread();thread.stop();

在克隆 Git 仓库并将 Maven 工具链配置为 JDK 8 和 JDK 11 之后,可以采用如下命令构建项目:

代码语言:javascript
复制
mvn clean package -Prelease

这将会在emt4j-assembly/target目录生成一个** .zip ** 文件,该文件可以进行解压。在解压后的目录中,就可以进行分析了。例如,在命令行中运行如下的命令:

代码语言:javascript
复制
java -cp "lib/analysis/*" org.eclipse.emt4j.analysis.AnalysisMain -f 8 -t 17 
    -o java8to17.html /home/user/application/classes

这将会分析指定目录下的类文件并在java8to17.html 文件中显示从 Java 8 升级到 Java 17 时的潜在问题。另外,也可以使用归档文件解压后在bin 目录下的** .bat  .sh 脚本来启动命令行分析。README 文件描述了分析类和 JAR ** 文件的所有可用选项。

由此生成的 HTML 文件将会展示描述、解决方案和问题的位置:

代码语言:javascript
复制
1.1 Removed API Back to Content
1.1.1 Description
Many of these APIs were deprecated in previous releases and 
    have been replaced by newer APIs.
1.1.2 How to fix
See corresponding JavaDoc.
1.1.3 Issues Context
Location: file:/home/user/application/classes/App.class, 
    Target: java.lang.Thread.stop()V

除此之外,在 Java 应用启动的时候,可以使用 EMT4J 代理,或者在构建应用的时候使用 Maven 插件。

该项目包含了从 Java 8 升级至 11 和从 Java 11 升级至 17 的规则集。例如,用于校验应用是否使用 JDK 内部 API 的 JDK 内部 API 规则:

代码语言:javascript
复制
<rule desc="JDK internal API" type="reference-class"   
    match-type="by-package" class-package-file="jdk_internals.cfg"
    result-code="JDK_INTERNAL" must-contain-in-bytecode="true"
    sub-result-code="@{subResultCode}" priority="p4">
    <support-modes>
       <mode>agent</mode>
        <mode>class</mode>
    </support-modes>
</rule>

support-modes 表明该规则是否可以用于 agent 模式和 / 或静态分析其中静态分析也就是 class 模式,能够用于命令行和 Maven 插件中。关于翻译资源的打包是通过 result-code 属性实现的,在本例中,也就是 _JDK_INTERNAL_,它会映射为emt4j-common/src/main/resources/default/i18n目录中的 JDK_INTERNAL.properties 和 JDK_INTERNAL_zh.properties 翻译文件。

EMT4J 会扫描应用的中的包和类,比如 _emt4j-common/src/main/resources/default/rule/8to11/data/ 目录中 _class-package-file jdk_internals.cfg 文件所定义的 sun.nio  sun.reflect。

实际的规则类型reference-class位于emt4j-common/src/main/java/org/eclipse/emt4j/common/rule/impl 目录中,因为 JDK 内部规则中,support-modes 的值为 agent  class。

代码语言:javascript
复制
@RuleImpl(type = "reference-class")
public class ReferenceClassRule extends ExecutableRule {

现有的规则可以提供灵感,以便于按照 README 文件所定义的说明添加自定义规则。

原文:Eclipse Migration Toolkit for Java (EMT4J) Simplifies Upgrading Java Applications(https://www.infoq.com/news/2022/12/eclipse-migration-toolkit-java/)

------

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-03,如有侵权请联系 [email protected] 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 [email protected] 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档