我们(坎坷的)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。
发布 Alpha 版本
正如 解释 Quarkus 3 计划的博客文章 中提到的,我们将从现在开始发布 Quarkus 3 的 Alpha 版本。
除非发现阻塞性问题。
-
我们每个月都会发布一个新的 3.0.0.AlphaX。
-
作为经验法则,每个 Alpha 版本都将基于每个小版本的 `2.y.3.Final`,因此将具有相同的功能集。
-
我们将在过程中引入其他更改,例如迁移到 Hibernate ORM 6 或迁移到 Flow API。
对这项工作感兴趣?
所有这项工作的“代码”都发布在 Quarkus 仓库的 jakarta
根文件夹中。
您可以通过多种方式使用它
-
使用我们每月发布的 Alpha 版本。
-
使用我们的快照,它们每天发布到 https://s01.oss.sonatype.org/content/repositories/snapshots/,版本为 `999-jakarta-SNAPSHOT`。
-
自己构建 `jakarta-rewrite` 分支,它每天发布,包含从当前 `main` 分支转换的结果。
您可以在 jakarta
文件夹的 README.md 中找到更多相关信息。