平台与流:发现 Quarkus 扩展的新方式

由 Erin Schnabel 共同撰写

正如您可能从近期的 Quarkus Insights 节目(尤其是 #48、#55 和 #57)中看到的,我们对 2.x 系列的工具进行了一系列更改,以改善开发人员体验。当 2.0 发布时,一些眼尖的 Quarkus CLI 用户发现了新的选项,我们很高兴在 Quarkus 2.1 发布之际解释这些选项的含义。

简而言之:我们有一套全新的、更细粒度的 BOM(物料清单),您可以代替大的 quarkus-universe-bom 使用。我们部署了一个注册表服务,该服务可以在这些更细粒度的 BOM 和我们的工具(maven、gradle 和 CLI)之间协调和管理平台兼容性,这些工具知道如何与此注册表协同工作,以简化与您的项目兼容的扩展发现。

在 2.1.0.Final 发布版本中,Quarkus CLI 使用此注册表来解析您项目所使用的 Quarkus 平台。

# The client will create a project with the latest/recommended quarkus release
$ quarkus create
# You can use the --stream parameter to narrow to a specific release
$ quarkus create -S 2.0
$ quarkus create -S 2.1

平台模型的演进

Quarkus 1.x 平台基于单个 BOM - io.quarkus:quarkus-universe-bom,Quarkus 应用程序会导入该 BOM。该 universe BOM 将包含所有 Quarkus 平台扩展及其依赖项。BOM 的目的是使用户可以轻松地对应用程序中使用的所有库和框架适用的版本对常用依赖项进行对齐。然而,糟糕的 BOM 组合实际上可能使其非常困难或几乎不可能实现这一点。总的来说,BOM 管理的依赖项范围越广,当用户在其应用程序中包含 BOM 未管理的库时,遇到不兼容问题的风险就越高。

io.quarkus:quarkus-universe-bom,正如其 artifactId 所暗示的那样,确实是一个庞大而多样化的 BOM,包括 Camel、Google Cloud Services、Kogito、OptaPlanner 和其他 Quarkus 平台成员的依赖项。导入 io.quarkus:quarkus-universe-bom 将对应用程序强制执行约 3600 个依赖项版本约束。

除了实际上几乎总是超出必要之外,它实际上可能导致严重的兼容性问题,如果 Quarkus 平台 BOM 不尝试管理“整个宇宙”,这个问题本可以避免。例如,将一个依赖于与 Camel Quarkus 不同的 commons-beanutils:commons-beanutils 版本的库包含到一个实际不包含任何 Camel Quarkus 扩展的应用程序中可能会出现问题,因为 io.quarkus:quarkus-universe-bom 将强制执行 Camel Quarkus 所需的版本。

从 Quarkus 2.0.0.Final 开始,除了单一的 io.quarkus:quarkus-universe-bom 之外,我们还定义了许多特定于平台成员的 BOM,例如:

  • io.quarkus.platform:quarkus-bom:2.1.0.Final - 相当于 io.quarkus:quarkus-bom

  • io.quarkus.platform:quarkus-camel-bom:2.1.0.Final - 仅管理 Camel Quarkus 相关的扩展及其所需的依赖项;

  • io.quarkus.platform:quarkus-kogito-bom:2.1.0.Final - 仅管理 Kogito Quarkus 相关的扩展及其所需的依赖项;

  • 等等

现在应用程序只需要导入相关的 BOM,这样就可以避免强制执行来自“宇宙”其他部分的依赖项约束。

考虑到每个成员特定的 BOM 实际上是 io.quarkus:quarkus-universe-bom 的一个片段,成员 BOM 可以按任何顺序导入而不会产生冲突。

开发工具支持

开发工具,如 Quarkus CLI、Maven 或 Gradle 插件,可用于使用新的平台模型创建和管理 Quarkus 应用程序项目。

io.quarkus:quarkus-universe-bom 在 Quarkus 2.0.0.Final 中仍然是默认的 BOM。从 Quarkus 2.1.0.Final 开始,我们建议改用更细粒度的、特定于成员的 BOM。

探索这个新的平台解析功能最简单的方法是使用新的 Quarkus CLI,例如使用以下命令安装:

curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio

安装后,您可以执行以下命令来创建项目

quarkus create app
对于早期版本的 CLI(2.1.0.Final 之前),您需要指定 --registry-client 选项,否则创建的项目将使用与客户端版本关联的 io.quarkus:quarkus-universe-bom

生成的 pom.xml 将导入以下 BOM

    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
    <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>${quarkus.platform.artifact-id}</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

这相当于 io.quarkus:quarkus-bom,但不包含任何其他平台成员,例如 Camel、Kogito、OptaPlanner 等。

让我们创建另一个包含 Kogito 扩展的项目

quarkus create -x kogito-quarkus-rules kogito-app

新项目导入两个 BOM(即 io.quarkus:quarkus-universe-bom 中与项目相关的两个片段)

    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
    <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-kogito-bom</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>${quarkus.platform.artifact-id}</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-quarkus-rules</artifactId>
    </dependency>

开发工具中的更广泛的 Quarkus 生态系统支持

Quarkus 平台并不代表整个 Quarkus 扩展生态系统(即 Quarkiverse),而是代表一套针对 Quarkus 作为开发栈主要用例的扩展。这意味着仍然有大量的 Quarkus 扩展不在 Quarkus 平台(BOM)中,例如,大多数托管在 Quarkiverse Hub 上的扩展。这些非平台扩展仍然可以像往常一样作为应用程序依赖项添加到 Quarkus 应用程序中。Quarkus 2.1.0.Final 的开发工具使这变得非常容易,例如:

quarkus create -x prettytime test-time-app

将创建一个新的 Quarkus 项目,其中包含一个非平台的 Quarkus Pretty Time 扩展

    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
    <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>${quarkus.platform.artifact-id}</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.quarkiverse.prettytime</groupId>
      <artifactId>quarkus-prettytime</artifactId>
      <version>0.1.0</version>
    </dependency>

Maven 和 Gradle 插件中的注册表客户端支持

Quarkus Maven 和 Gradle 插件仍然可用于管理 Quarkus 项目。

mvn io.quarkus:quarkus-maven-plugin:2.1.0.Final:create \
    -Dextensions=kogito-quarkus-rules,prettytime \
    -DprojectGroupId=org.acme -DprojectArtifactId=quarkus-app -DprojectVersion=1.0 \