Micronaut 升级到 Micronaut 3.x

2023-02-23 14:56 更新

本节介绍将 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
implementation("javax.inject:javax.inject:1")
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

任何依赖注释元数据中存在的 ​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
implementation("io.micronaut.rxjava2:micronaut-rxjava2")
<dependency>
    <groupId>io.micronaut.rxjava2</groupId>
    <artifactId>micronaut-rxjava2</artifactId>
</dependency>

此外,如果使用了任何 ​Rx​ HTTP 客户端接口,则必须添加依赖项并且必须更新导入。

 Gradle  Maven
implementation("io.micronaut.rxjava2:micronaut-rxjava2-http-client")
<dependency>
    <groupId>io.micronaut.rxjava2</groupId>
    <artifactId>micronaut-rxjava2-http-client</artifactId>
</dependency>

表 1. RxJava2 HTTP 客户端导入

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 
implementation("io.micronaut.rxjava2:micronaut-rxjava2-http-server-netty")
<dependency>
    <groupId>io.micronaut.rxjava2</groupId>
    <artifactId>micronaut-rxjava2-http-server-netty</artifactId>
</dependency>

我们建议切换到 Project Reactor,因为这是 Micronaut 内部使用的实现。向 RxJava2 添加依赖项将导致在应用程序的运行时类路径中实现这两种实现。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号