@levinzhang
2023-01-14T13:25:13.000000Z
字数 2606
阅读 382
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 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规则:
<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