@levinzhang
2023-01-14T05:25:13.000000Z
字数 2606
阅读 947
by
Adoptium发布了Eclipse Migration Toolkit for Java(EMT4J),这是一个开源的Eclipse项目,能够分析和升级应用的Java版本,以便于从Java 8升级至Java 11,从Java 11升级至Java 17。EMT4J将支持升级到未来的LTS版本。
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()方法:
Thread thread = new Thread();thread.stop();
在克隆Git仓库并将Maven工具链配置为JDK 8和JDK 11之后,可以采用如下命令构建项目:
mvn clean package -Prelease
这将会在emt4j-assembly/target目录生成一个.zip文件,该文件可以进行解压。在解压后的目录中,就可以进行分析了。例如,在命令行中运行如下的命令:
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文件将会展示描述、解决方案和问题的位置:
1.1 Removed API Back to Content1.1.1 DescriptionMany of these APIs were deprecated in previous releases andhave been replaced by newer APIs.1.1.2 How to fixSee corresponding JavaDoc.1.1.3 Issues ContextLocation: 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规则:
<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。
@RuleImpl(type = "reference-class")public class ReferenceClassRule extends ExecutableRule {
现有的规则可以提供灵感,以便于按照README文件所定义的说明添加自定义规则。
查看英文原文:Eclipse Migration Toolkit for Java (EMT4J) Simplifies Upgrading Java Applications
