Micronaut 升级到 Micronaut 3.x
本节介绍将 Micronaut 2.x 应用程序升级到 Micronaut 3.0.0 所需的步骤。
下面的部分进行了更详细的介绍,但在较高层次上,该过程通常涉及:
-
更新版本
-
更新注解
-
选择 Reactive 实现
-
调整受重大更改影响的代码
通常,升级应该很简单,但使用 OpenRewrite 可以为自己节省一些工作,OpenRewrite 是一种自动重构工具,您可以使用它来进行许多必需的升级更改。
使用 OpenRewrite 自动升级
OpenRewrite 适用于用 Java 编写的 Micronaut 应用程序,但 OpenRewrite 目前不支持 Kotlin 或 Groovy。与任何自动化工具一样,它会为您完成大部分工作,但请务必查看生成的更改并手动进行 OpenRewrite 不支持的任何更改,例如从 RxJava2 转换为 Reactor。
如果您将使用 OpenRewrite,请不要进行任何会导致您的应用程序无法编译的升级更改,例如将 Micronaut 版本更新到 3.x。这将导致使用
javax.inject
注释(如 @Singleton
)或 RxJava2 类(如 io.reactivex.Flowable
)的应用程序类无法编译,因为默认情况下不再包含这些依赖项。相反,使用 OpenRewrite 来完成初始工作,然后自己完成那些不可能或不适合自动化的步骤。
为您的构建添加 OpenRewrite 支持很容易,只需要添加 Gradle 或 Maven 插件并配置插件以使用 Micronaut 升级配方。
请参阅 Gradle 功能差异 或 Maven 功能差异 以查看所需的构建脚本更改。
对构建脚本进行更改后,您可以“试运行”Micronaut 升级配方以查看将进行哪些更改。
对于 Gradle,运行
$ ./gradlew rewriteDryRun
并查看在 build/reports/rewrite/rewrite.patch
中生成的差异报告
对于 Maven,运行
$ ./mvnw rewrite:dryRun
并查看 target/site/rewrite/rewrite.patch
中生成的差异报告。
然后你可以真正运行 recipe,让 OpenRewrite 更新你的代码。
对于 Gradle,运行
$ ./gradlew rewriteRun
对于 Maven,运行
$ ./mvnw rewrite:run
完成更改后,您可以删除插件,但最好保留它,因为 OpenRewrite 不会自动运行,只有当您运行其中一个命令时。除了 Micronaut 升级 recipe 之外,还有更多可用的 recipe,您可能希望包含这些 recipe 以自动执行其他代码更改。
该插件包含另一个命令,用于列出当前在类路径中的所有 recipe(在本例中是核心 recipe 加上由 rewrite-micronaut
模块添加的 recipe)。
对于 Gradle,运行
$ ./gradlew rewriteDiscover
对于 Maven,,运行
$ ./mvnw rewrite:discover
可用的 recipe 和样式将输出到控制台。查看 OpenRewrite 文档 以获取更多信息并查看许多其他可用的方法。
版本更新
如果您使用 Gradle,请更新 gradle.properties
中的 micronautVersion
属性,例如
gradle.properties
micronautVersion=3.8.5
如果您使用 Maven,请更新 pom.xml
中的父 POM 版本和 micronaut.version
属性,例如
pom.xml
<parent>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-parent</artifactId>
<version>3.8.5</version>
</parent>
<properties>
...
<micronaut.version>3.8.5</micronaut.version>
...
</properties>
构建插件更新
如果您使用 Micronaut Gradle 插件 更新到 最新版本。
对于 Maven 用户,插件版本会在您更新 Micronaut 版本时自动更新。
注入注解
javax.inject
注释不再是传递依赖。 Micronaut 现在附带 Jakarta 注入注解。用 jakarta.inject
替换所有 javax.inject
导入,或者添加对 javax-inject
的依赖以继续使用旧的注释:
Gradle | Maven |
|
|
任何依赖注释元数据中存在的 javax.inject
注释的代码仍将按预期工作,但是必须更改与它们交互的任何代码以不再引用注释类本身。使用注释元数据时,应使用 AnnotationUtil 类中的静态变量(例如 AnnotationUtil.INJECT
、AnnotationUtil.SINGLETON
等)代替注释类。
可空性注解
Micronaut 现在只带有自己的一组注释来声明可空性。 findbugs、javax 和 jetbrains 注释仍然受支持,但是您必须添加依赖项才能使用它们。要么切换到 Micronaut @Nullable / @NonNull 注释,要么为您希望使用的注释库添加依赖项。
RxJava2
Micronaut 不再将任何响应式实现作为我们任何模块或核心库中的默认实现。升级到 Micronaut 3 需要选择要使用的反应流实现,然后添加相关依赖项。
对于那些已经在使用 RxJava3 或 Project Reactor 的人,升级到 Micronaut 3 应该不需要做任何更改。如果您使用 RxJava2 并希望继续使用它,则必须添加一个依赖项:
Gradle | Maven |
|
|
此外,如果使用了任何 Rx
HTTP 客户端接口,则必须添加依赖项并且必须更新导入。
Gradle | Maven |
|
|
旧 | 新 |
---|---|
io.micronaut.http.client.RxHttpClient |
io.micronaut.rxjava2.http.client.RxHttpClient |
io.micronaut.http.client.RxProxyHttpClient |
io.micronaut.rxjava2.http.client.proxy.RxProxyHttpClient |
io.micronaut.http.client.RxStreamingHttpClient |
io.micronaut.rxjava2.http.client.RxStreamingHttpClient |
io.micronaut.http.client.sse.RxSseClient |
io.micronaut.rxjava2.http.client.sse.RxSseClient |
io.micronaut.websocket.RxWebSocketClient |
io.micronaut.rxjava2.http.client.websockets.RxWebSocketClient |
如果使用基于 Netty 的服务器实现,则必须添加额外的依赖项:
Gradle | Maven |
|
|
我们建议切换到 Project Reactor,因为这是 Micronaut 内部使用的实现。向 RxJava2 添加依赖项将导致在应用程序的运行时类路径中实现这两种实现。
更多建议: