The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

プラットフォームとストリーム:Quarkusエクステンションを発見する新しい方法

Co-authored by Erin Schnabel

最近のQuarkus Insightsのエピソード(#48、#55、#57)をご覧になった方はご存知かと思いますが、Quarkus 2.xでは開発者のエクスペリエンスを向上させるためにツールに多くの変更を加えました。2.0がリリースされたとき、目の肥えたQuarkus CLIユーザーがいくつかの新しいオプションを見つけました。

TL;DR: quarkus-universe-bom のような大きなBOMではなく、より詳細な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プラットフォームは、Quarkusアプリケーションによってインポートされる単一のBOM( io.quarkus:quarkus-universe-bom )に基づいていました。ユニバースのBOMには、すべてのQuarkusプラットフォームのエクステンションとその依存関係が含まれています。BOMは、アプリケーションで使用されるすべてのライブラリやフレームワークで動作するバージョンに、共通の依存関係を簡単に揃えることを目的としています。しかし、BOMの構成が悪いと、実際にはそれを達成するのが非常に難しいか、実質的に不可能になることがあります。一般的に、BOMが管理する依存関係の範囲が広ければ広いほど、ユーザーがBOMで管理されていないライブラリをアプリケーションに組み込む際に非互換性の問題が発生するリスクが高くなります。

io.quarkus:quarkus-universe-bom は、そのartifactIdが示すように、Camel、Google Cloud Services、Kogito、OptaPlanner、その他のQuarkusプラットフォームのメンバーの依存関係を含む、正に大規模で多様なBOMです。 io.quarkus:quarkus-universe-bom をインポートすると、アプリケーションに約3600の依存関係のバージョン制約が適用されます。

実質的に常に必要以上に多いという事実に加えて、QuarkusプラットフォームのBOMが"universe"を管理しようとしていなければ回避できたかもしれない深刻な互換性の問題を実際に引き起こす可能性があります。例えば、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のみをインポートする必要があり、残りの"universe"からの依存性制約を強いることがなくなります。

すべてのメンバー固有の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 が使用されます。

The generated pom.xml will be importing the following 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>

これは、Camel、Kogito、OptaPlannerなどの他のプラットフォームのメンバーを含まない io.quarkus:quarkus-bom と同等のものです。

それでは、Kogitoエクステンションを含む別のプロジェクトを作ってみましょう。

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

新しいプロジェクトでは、2つのBOM(すなわち、プロジェクトに関連する io.quarkus:quarkus-universe-bom の2つのフラグメント)をインポートします。

    <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プラットフォーム(BOM)に存在しないQuarkusのエクステンションはまだたくさんあります(例: Quarkiverse Hubでホストされているエクステンションのほとんど)。これらの非プラットフォームのエクステンションは、通常のアプリケーション依存関係としてQuarkusアプリケーションに追加することができます。Quarkus 2.1.0.Finalの開発ツールでは、以下のように非常に簡単に行うことができます。

quarkus create -x prettytime test-time-app

非プラットフォームの Quarkus Pretty Timeエクステンションを持つ新しいQuarkusプロジェクトが作成されます。

    <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 \