一個簡化 Java 應用升級的開源項目:EMT4J
來源:InfoQ,作者 | Johan Janssen、譯者 | 張衛(wèi)濱、策劃 | 丁曉昀
Adoptium 發(fā)布了 Eclipse Migration Toolkit for Java(EMT4J),這是一個開源的 Eclipse 項目,能夠分析和升級應用的 Java 版,以便于從 Java 8 升級至 Java 11,從 Java 11 升級至 Java 17。EMT4J 將支持升級到未來的 LTS 版本。
很多組織都建議使用最新的 Java 運行時,以獲取安全性和功能方面的改進。同時,長期支持(Long Term Support)的 Java 版本每兩年發(fā)布一次,Spring Framework 6 等項目已經(jīng)至少需要 Java 17。令人遺憾的是,新 Java 版本的采用是相對緩慢的。例如,在 2022 年,也就是 Java 11 發(fā)布四年之后,只有不到 49% 的 Java 應用在使用該版本。
將應用升級至較新的 Java 版本意味著開發(fā)人員需要解決 Java 內(nèi)部變更和功能移除所帶來的所有問題。這涉及的功能包括 Nashorn、J2EE 和 Java 等包的移除、API 的變更以及對 Java 內(nèi)部訪問更嚴格的限制。
EMT4J 提供了一個支持 Maven 插件(目前在 Maven 中央倉庫尚不可用)、Java 代理以及命令行的解決方案,以便于分析項目與新版本 Java 的不兼容性,結(jié)果會以 ** TXT、JSON 或 HTML** 格式輸出。
為了演示 EMT4J,考慮如下的樣例應用,它調(diào)用了 Java 11 中已經(jīng)刪除的 ** Thread.stop() **方法:
Thread thread = new Thread();thread.stop();
在克隆 Git 倉庫并將 Maven 工具鏈配置為 JDK 8 和 JDK 11 之后,可以采用如下命令構(gòu)建項目:
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 代理,或者在構(gòu)建應用的時候使用 Maven 插件。
該項目包含了從 Java 8 升級至 11 和從 Java 11 升級至 17 的規(guī)則集。例如,用于校驗應用是否使用 JDK 內(nèi)部 API 的 JDK 內(nèi)部 API 規(guī)則:
<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 表明該規(guī)則是否可以用于 agent 模式和 / 或靜態(tài)分析,其中靜態(tài)分析也就是 class 模式,能夠用于命令行和 Maven 插件中。關于翻譯資源的打包是通過 result-code 屬性實現(xiàn)的,在本例中,也就是 _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。
實際的規(guī)則類型reference-class位于emt4j-common/src/main/java/org/eclipse/emt4j/common/rule/impl 目錄中,因為 JDK 內(nèi)部規(guī)則中,support-modes 的值為 agent 和 class。
@RuleImpl(type = "reference-class")
public class ReferenceClassRule extends ExecutableRule {
現(xiàn)有的規(guī)則可以提供靈感,以便于按照 README 文件所定義的說明添加自定義規(guī)則。
推薦閱讀
你好,我是程序猿DD,10年開發(fā)老司機、阿里云MVP、騰訊云TVP、出過書創(chuàng)過業(yè)、國企4年互聯(lián)網(wǎng)6年。從普通開發(fā)到架構(gòu)師、再到合伙人。一路過來,給我最深的感受就是一定要不斷學習并關注前沿。只要你能堅持下來,多思考、少抱怨、勤動手,就很容易實現(xiàn)彎道超車!所以,不要問我現(xiàn)在干什么是否來得及。如果你看好一個事情,一定是堅持了才能看到希望,而不是看到希望才去堅持。相信我,只要堅持下來,你一定比現(xiàn)在更好!如果你還沒什么方向,可以先關注我,這里會經(jīng)常分享一些前沿資訊,幫你積累彎道超車的資本。
