我们(坎坷的)Jakarta EE 10 之路

Quarkus 在 Jakarta EE 方面一直相对沉默,直到几周前,与其他一些框架提早公布了清晰的计划和时间表相比。这并不意味着我们没有积极准备过渡,我们一直在非常努力地使其成为现实。

你们中的大多数人现在应该已经听说过 Java 生态系统中即将到来的 EE 9/EE 10 过渡。

  • 它主要因 `javax.*` → `jakarta.*` 的包更改而闻名,因为这是最显眼的更改。

  • 但 Jakarta EE 10 带来了规范中的新功能,当然还有实现。

现在 Jakarta EE 10 已发布,并且我们已经公布了 Quarkus 3 的总体方法,是时候更详细地讨论我们的计划了。

Jakarta EE 9

到目前为止可能已经很清楚了,但我们决定完全跳过 Jakarta EE 9。Jakarta EE 9 是 EE 8 的 `import jakarta.*` 重新品牌化版本,没有实际的附加功能。

当然,它可以作为过渡的第一步,但它对应用程序开发人员来说也极具颠覆性。

  • 他们必须重构他们的代码库,将 `javax.*` 包切换到 `jakarta.*` 包。

  • 他们需要确保他们所有的依赖项实际上都支持新包。虽然起初情况并非如此,但现在情况已经大有改善。

虽然我们认为 EE 9 对框架开发人员很有价值(稍后会详细介绍),但对应用程序开发人员的价值远非显而易见。

因此,就我们的用户而言,我们决定在 Quarkus 中完全跳过它。

我们的方法

EE 9 重返舞台

所以跳过 Jakarta EE 9,对吧?嗯,实际上,不是。我们不会发布任何基于 Jakarta EE 9 的 Quarkus 版本,但是… Jakarta EE 9 在我们的迁移过程中实际上非常有用。它不改变 API,因此被认为是我们迁移过程的一个很好的第一步。

所以我们决定首先以 Jakarta EE 9 为目标。

迁移过程?

如前所述,Quarkus 迁移到 Jakarta EE 9/10 极具颠覆性。

  • 通过 Eclipse Transformer,调整包和服务加载器文件相对容易自动化。当然,对于像 Quarkus 这样庞大而复杂的代码库来说,这并非易事。例如,我们在 Quarkus 中进行了大量的代码生成,并且我们的一些生成代码签名中硬编码了引用(例如 `Ljavax/enterprise/util/AnnotationLiteral<L%1$s;>;L%1$s;`),这些引用没有被转换。

  • 我们还必须调整大量依赖项,并采用各种策略

  • 新版本

  • 新工件

  • 分类器

  • 全新的项目

  • 新版本、新工件、新项目可能会带来需要 Quarkus 端调整的更改。

  • 更新依赖项可能需要调整我们的禁止依赖项规则,以确保我们不会最终使用旧的基于 EE 8 的依赖项。

因此,我们必须按顺序遍历 Quarkus 的所有模块,进行所有必要的调整,使其能够编译,至少通过基本测试。

Quarkus 项目的大小和复杂性使其比您典型的项目预期更难。所以,如果您是应用程序开发人员,过渡将更容易,创伤也更少,尤其是因为我们将提供工具来自动化大部分过渡。

此时,您可能已经明白,这个过程花费了数月才达到一种可以工作的状态,并且虽然大多数调整都是微不足道的,但更改是巨大的。最后,您可能还意识到我们不想每天提交大量提交和 rebase - 并修复无数冲突。

这就是为什么我们有一个迁移过程:我们有一个转换脚本,我们将其应用于 Quarkus `main` 分支。我们发布一个分支,并在其上运行 CI。我们每天这样做,以确保没有任何东西会破坏转换。

这项(繁琐但有趣)工作的成果有多种形式

  • 我们在 `main` 分支中直接应用了补丁,使转换更容易、更可靠。

  • 我们有一组 OpenRewrite 规则来调整我们的 POM 文件(版本、工件……)。

  • 我们有自己的 OpenRewrite 分支,因为其中一些行为与我们的做法不兼容(但我们的大部分更改都已贡献给 OpenRewrite 项目),主要是因为 Quarkus 项目的复杂结构。

  • 我们使用 Jakarta Eclipse Transformer 来重写大多数类和服务加载器文件。

  • 我们有一个 `transform.sh` 脚本来协调和执行所有必需的操作,包括一些手动调整。这个脚本不是特别漂亮,但它有效。而且我们每天运行 CI 都会捕捉到任何问题。

这是针对 Jakarta EE 9 的。现在让我们来看看 Jakarta EE 10。

Jakarta EE 10

这是 Quarkus 3 的最终目标。Jakarta EE 10 带来了一些 API 更改,其中一些需要对 Quarkus 代码库进行调整。

这通常是 CDI 和我们的实现 ArC,或者 JAX-RS 的情况,我们对 RESTEasy Classic 和 RESTEasy Reactive 都进行了更改。

我们认为用 OpenRewrite 规则来实现这些 API 更改不是一个好主意,我们采取了一种更简单的方法:我们维护包含这些更改的分支,并将其应用于我们的迁移过程之上。

维护这些分支的工作量不大,因为调整不在我们进行大量更改的区域。

我们现在在哪里?

我们现在处于您可以实际测试此工作并提供反馈的状态。我们也开始让扩展生态系统为 Quarkus 3 做好准备。

我将很快发布 3.0.0.Alpha1 的公告,其中包含更多详细说明。

发布 Alpha 版本

正如 解释 Quarkus 3 计划的博客文章 中提到的,我们将从现在开始发布 Quarkus 3 的 Alpha 版本。

除非发现阻塞性问题。

  • 我们每个月都会发布一个新的 3.0.0.AlphaX。

  • 作为经验法则,每个 Alpha 版本都将基于每个小版本的 `2.y.3.Final`,因此将具有相同的功能集。

  • 我们将在过程中引入其他更改,例如迁移到 Hibernate ORM 6 或迁移到 Flow API。

对这项工作感兴趣?

所有这项工作的“代码”都发布在 Quarkus 仓库的 jakarta 根文件夹中。

您可以通过多种方式使用它

您可以在 jakarta 文件夹的 README.md 中找到更多相关信息。