使用 OpenRewrite 可以实现将Java 项目自动升级到Java 21语法。
基于Maven项目的实现步骤
步骤非常简单, 具体如下:
- 在pom.xml 中添加如下插件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.42.0</version>
<configuration>
<exportDatatables>true</exportDatatables>
<activeRecipes>
<recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
</activeRecipes>
</configuration>
<dependencies>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>2.26.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
- 运行OpenRewrite 的Java升级的配方
mvn rewrite:run
运行示例
举例来看,Java 21 对于线程控制方法的写法做了升级:
以下是Java旧版的线程的写法:
public void Java8Thread() {
Thread thread = new Thread();
thread.start();
thread.suspend();
thread.resume();
thread.stop();
}
在 JDK 21 中,不推荐使用Thread.suspend()
,Thread.resume()
, 和Thread.stop()
方法,因为这些方法已经被废弃(deprecated)多年,并且存在严重的安全性和一致性问题。
升级前的代码:
升级后的代码:
OpenRewrite Java升级解密
上面示例的Java 升级到21是如何实现的呢?
其实是OpenWrite 提供的下面配方(Recipe):
- groupId: org.openrewrite.recipe
- artifactId: rewrite-migrate-java
- version: 2.26.1
该配方可以在Maven 的中央库获取: https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/2.26.1/jar
这个配方也是有很多子配方组成的, 具体包括:
- 迁移到Java 17
- 将内部版本升级到Java 21
- 删除非法分号
- 将Thread.resumme()、Thread.stop()和Thread.suped()替换为抛出新的UnsupportedOperationException()
- URLConstructorsToURI
- 采用 SequencedCollection
- 使用Locale.of(…) 替换 new Locale(…)
- 替换已弃用的Runtime#exec()方法
- 升级操作/设置java java版本
- 将插件升级到Java 21兼容版本
- 避免在java.desktop中使用已弃用的空finalize()方法
- 采用javax.security.auth。Subject.current()和javax.security.auth。Subject.callAs()方法`
其实这些配方的组合也不一定是完全的, 如何发现有一些没有覆盖的,也可以到GitHub获取该配方的源码之后进行改进,GitHub的地址是: https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/java-version-21.yml
本篇完整代码地址:
- https://github.com/osxm/ai_ency/tree/main/openrewrite-demo