Frequently asked questions about writing extensions

エクステンションを作成すべきか

エクステンションを作成すべき理由

エクステンションについて を参照してください。 エクステンションの成熟度マトリックス は、エクステンションが提供できる機能の種類を示しています。 エクステンションが実行できるもう 1 つの便利な機能は、他のエクステンションをバンドルすることです。 アグリゲーターエクステンションの例については、Quarkus MicroProfile エクステンション を参照してください。

Are there cases an extension isn’t necessary?

すべての問題にエクステンションが必要なわけではありません。 外部ライブラリー (まだエクステンションではないもの) をバンドルして、小さな調整を加えるだけの場合は、エクステンションは必要ない場合があります。 たとえば、プレーンライブラリーは新しい設定要素を作成し、Jandex を使用してクラスを登録できます (この ブログで方法が示されています)。

エクステンションに追加すべきケイパビリティーの種類を知る方法

バイトコード変換

クラスパス上のコードを変更するにはどうすればよいですか?

BytecodeTransformerBuildItem を使用してバイトコードを操作できます。 たとえば、依存関係から問題のあるブリッジメソッドを削除したブログ を参照してください。

CDI

I’m working with CDI, and I don’t know how to …​

CDI インテグレーションガイド では、エクステンションの作成者向けに、さまざまな CDI 関連のユースケースに対するソリューションが提示されています。

I have transformed a user class to add an injected field, but CDI isn’t working

エクステンションが BytecodeTransformerBuildItem を使用してユーザークラスを変換し、 @jakarta.annotation.Resource@jakarta.inject.Inject に置き換えるとどうなりますか? フィールドは Arc によって挿入されません。 デバッグでは、変換されたクラスがアプリケーションにロードされていることが表示されますが、Arc では新しいコードが認識されないようです。

Arc 関連の変換は、通常、AnnotationsTransformerBuildItem を使用して実行する必要があります。 その理由は、Quarkus のすべてのバイトコード変換が Jandex のインデックス作成後に行われるためです。つまり、変更は Jandex に反映されません。

ほとんどのエクステンションは、Jandex を信頼できる情報源として使用し、何をすべきかを判断します。これらのエクステンションは、バイトコード内の新規または変更されたエンドポイントを認識できません。 この制限は、アノテーショントランスフォーマーで解決できます。ただし、Arc や Quarkus REST はアノテーショントランスフォーマーを適用しますが、すべてのエクステンションが対応しているわけではないことにも注意が必要です。

クラスパスのいずれかに @Inject アノテーションが追加されており、CDI が正しく機能しません。修正する方法を教えてください

AnnotationsTransformer を実装し、問題のある注入サイトを取り除く必要があります。(ユースケースに CDI が含まれる場合は、BytecodeTransformer ではなく AnnotationsTransformer にする必要があることに注意してください。) AnnotationsTransformer エクステンションを使用して Airline ライブラリーから @Inject 以外のアノテーションをクリーンアップし、CDI 対応ランタイムで使用できるようにする方法は、このブログ を参照してください。

複数の部分に共通する機能や関心事

アプリケーションログを外部サービスにリダイレクトするにはどうすればよいですか?

LogHandlerBuildItem は、アプリケーションログをリダイレクトする便利な方法です。出力を AWS CloudWatch に転送するエクステンションの実例 を参照してください。

How can I ensure a build step always runs even if it doesn’t produce anything consumed by another build step?

エクステンションは、ビルドプロセスの他の部分がその出力(出力が存在する場合)を消費するかどうかにかかわらず、一部のビルドステップを実行する必要がある場合があります。このような機能は独立したビルドステップに配置すべきではなく、むしろ別のステップの一部であるべきだと主張することもできます。しかし、他のビルドタスクと並行して実行できるように、独立した処理を別々のビルドステップで実行することには意味があるかもしれません。

そのような状況では、あなたのビルドステップに @Produce(ServiceStartBuildItem.class) アノテーションを付与することで、自動生成される ServiceStartBuildItem を生成させることができます。これは内部の Quarkus ビルドステップによって消費されるため、あなたのビルドステップが常に「消費され」、ビルドプロセスに含まれることが保証されます。別の選択肢として、ビルドステップに @Produce(ArtifactResultBuildItem.class) アノテーションを付与することもできますが、このアイテムは Quarkus の開発モードでは消費されないため、この場合、あなたのビルドステップは有効になりません。

エクステンションのインフラストラクチャーの構築とホスティング

エクステンションをビルドするために Gradle を使用できますか?

はい、ただし、それは最も典型的なパターンではありません。 Gradle エクステンションの設定手順は、初めてのエクステンション構築ガイド を参照してください。実装例については JobRunr エクステンション を参照してください。

エクステンションを code.quarkus.io に配置したい場合、Quarkiverse GitHub org に配置する必要がありますか?

カタログにエクステンションの登録と、ソースコードの場所とは無関係です。 quarkiverse リポジトリー には、エクステンションのリリースとテストを容易にするためのショートカットがいくつかありますが、どのエクステンションでも カタログに登録 できます。

My extension isn’t showing up on extensions.quarkus.io

エクステンションカタログ 内のエクステンションはすべて、 http://code.quarkus.io、 http://extensions.quarkus.io、およびコマンドラインツールに表示されるはずです。 http://extensions.quarkus.io の Web ページは数回遅れて更新されるため、新しいエクステンションが表示されるまでに時間がかかる場合があります。 不足しているエクステンションをデバッグするには、まず次の手順を実行します。

その他のトピック

What’s the difference between a quickstart and a codestart?

コードスタートとクイックスタートはどちらも、ユーザーがすぐにコーディングを始められるように設計されています。 コードスタートは生成されたアプリケーションであり、クイックスタートは参照可能なソースコードです。 Codestarts を使用すると、カスタマイズされたアプリケーションを作成できるため、非常に強力です。