Jandexインデックスを使用したQuarkusBeanの検出
1. 概要
この記事では、Quarkusでのbeanディスカバリーと従来のJakartaEE環境の違いについて学習します。 Quarkusが外部モジュールでアノテーション付きクラスを確実に検出できるようにする方法に焦点を当てます。
2. Quarkusがインデックス作成を必要とする理由
Quarkus の主な利点の1つは、起動時間が非常に速いことです。 これを実現するために、Quarkusは、クラスパスアノテーションスキャンなどのステップを実行時からビルド時に進めます。 このため、ビルド時にすべての依存関係をアナウンスする必要があります。
そのため、実行時環境でクラスパス拡張によってアプリケーションを拡張することはできなくなりました。 ビルド中にメタデータが収集されると、インデックス作成がゲームに加わります。 インデックス作成とは、メタデータをインデックスファイル内に保存することを意味します。 これにより、アプリケーションは起動時または必要なときにいつでもそれをすばやく読み取ることができます。
簡単なスケッチを使用して違いを調べてみましょう。
Quarkusは、 Jandex を使用して、インデックスを作成および読み取ります。
3. インデックスを作成する
Quarkusプロジェクトのクラスでは、特別なことをする必要はありません。QuarkusMavenプラグインがインデックスを自動的に生成します。 ただし、依存関係(プロジェクト内部モジュールと外部ライブラリ)に注意を払う必要があります。
3.1. JandexMavenプラグイン
独自のモジュールでこれを実現する最も明白な方法は、JandexMavenプラグインを使用することです。
<build>
<plugins>
<plugin>
<!-- https://github.com/wildfly/jandex-maven-plugin -->
<groupId>org.jboss.jandex</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>make-index</id>
<goals>
<!-- phase is 'process-classes by default' -->
<goal>jandex</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
このプラグインは、JARにパッケージ化された「META-INF/jandex.idx」ファイルを作成します。 Quarkusは、実行時にライブラリから提供されたときにこのファイルを読み取ります。 したがって、そのようなファイルを含む各ライブラリは、暗黙的にインデックスを拡張します。
Gradleビルドの場合、org.kordamp.gradle.jandexプラグインを使用できます。
plugins {
id 'org.kordamp.gradle.jandex' version '0.11.0'
}
3.2. アプリケーションのプロパティ
依存関係を変更できない場合(たとえば、外部ライブラリの場合)、Quarkusプロジェクトのapplication.propertiesファイルで依存関係を明示的に指定する必要があります。
quarkus.index-dependency.<name>.group-id=<groupId>
quarkus.index-dependency.<name>.artifact-id=<artifactId>
quarkus.index-dependency.<name>.classifier=(optional)
3.3. フレームワーク固有の影響
Jandex Mavenプラグインを使用する代わりに、モジュールに META-INF /Beans.xmlファイルを含めることもできます。 これは実際にはいくつかの調整でQuarkusに採用されているCDIテクノロジーの一部ですが、CDI管理のBeanのみの使用に制限されていません。 インデックスのスコープはモジュール全体であるため、たとえばJAX-RSリソースを宣言することもできます。
4. 結論
この記事では、Quarkusが実行時に注釈付きクラスを検出するためにJandexインデックスが必要であると判断しました。 インデックスはビルド時に生成されるため、標準テクノロジでは、ビルド後にクラスパスに追加された注釈付きクラスは検出されません。
いつものように、すべてのコードはGitHubで利用できます。 QuarkusアプリケーションとCDI管理のBeanを提供するいくつかの依存関係を含むマルチモジュールプロジェクトがあります。