なぜカスタム拡張機能?それは可能だからです!

正直に言いましょう:市販のソリューションでは十分でないことがあります。時には、自分で手を動かして、特注のものを作る必要があります。そこで登場するのがカスタムQuarkus拡張機能です。これらは、あなたのアプリケーションを独自に強力にする秘密のソースのようなものです。

「大いなる力には大いなる責任が伴う」 – ベンおじさん(そしてすべてのQuarkus開発者)

拡張機能のポーションの材料

始める前に、道具を集めましょう:

  • 少しの創造力(心配しないで、たくさんあります)
  • Quarkus(当然)
  • Jakarta EE(頼れる相棒)
  • 少しの忍耐(本当に必要です)

ステップ1:拡張機能の概念化

まず最初に、拡張機能に何をさせたいですか?このチュートリアルでは、楽しくて役立つものを作りましょう:「RandomQuoteGenerator」拡張機能です。コードに知恵(またはおふざけ)の一滴が必要でない人なんていませんよね?

ステップ2:プロジェクトのセットアップ

さあ、手を汚す時間です。ターミナルを開いて、新しいQuarkus拡張プロジェクトを作成しましょう:

mvn io.quarkus:quarkus-maven-plugin:create-extension -DextensionId=io.mycompany:quarkus-random-quote-generator

このコマンドは、拡張機能の基本構造を作成します。家の基礎のようなもので、まだあまり面白くはありませんが、重要です。

ステップ3:コア機能の実装

さて、骨に肉をつけましょう。重労働をするRandomQuoteGeneratorクラスを作成します:

package io.mycompany.quarkus.random.quote.generator;

import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
import java.util.Random;

@ApplicationScoped
public class RandomQuoteGenerator {
    private static final List<String> QUOTES = List.of(
        "I'm not a great programmer; I'm just a good programmer with great habits." - Kent Beck,
        "Talk is cheap. Show me the code." - Linus Torvalds,
        "Programming isn't about what you know; it's about what you can figure out." - Chris Pine
    );

    private final Random random = new Random();

    public String getRandomQuote() {
        return QUOTES.get(random.nextInt(QUOTES.size()));
    }
}

この美しいJakarta CDIアノテーション(@ApplicationScoped)を見てください。クラスにスーパーパワーを与えているようなものです!

ステップ4:ランタイムモジュールの作成

次に、ランタイムモジュールをセットアップする必要があります。これは、誰かが実際に拡張機能を使用するときに魔法が起こる場所です:

package io.mycompany.quarkus.random.quote.generator.runtime;

import io.mycompany.quarkus.random.quote.generator.RandomQuoteGenerator;
import io.quarkus.arc.runtime.BeanContainer;
import io.quarkus.runtime.annotations.Recorder;

@Recorder
public class RandomQuoteGeneratorRecorder {
    public void initialize(BeanContainer container) {
        container.instance(RandomQuoteGenerator.class).getRandomQuote();
    }
}

このレコーダークラスは、舞台裏のスタッフのようなもので、すべてを舞台裏でセットアップします。

ステップ5:デプロイメントモジュール - ピースが一つになる場所

次に、デプロイメントモジュールを作成しましょう。ここでQuarkusに拡張機能をどのように統合するかを指示します:

package io.mycompany.quarkus.random.quote.generator.deployment;

import io.mycompany.quarkus.random.quote.generator.RandomQuoteGenerator;
import io.mycompany.quarkus.random.quote.generator.runtime.RandomQuoteGeneratorRecorder;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;

class RandomQuoteGeneratorProcessor {

    private static final String FEATURE = "random-quote-generator";

    @BuildStep
    FeatureBuildItem feature() {
        return new FeatureBuildItem(FEATURE);
    }

    @BuildStep
    AdditionalBeanBuildItem registerBean() {
        return AdditionalBeanBuildItem.unremovableOf(RandomQuoteGenerator.class);
    }

    @BuildStep
    @Record(ExecutionTime.RUNTIME_INIT)
    void initialize(RandomQuoteGeneratorRecorder recorder) {
        recorder.initialize();
    }
}

このプロセッサは、オーケストラの指揮者のようなもので、拡張機能のすべての部分が調和して演奏するようにします。

ステップ6:設定

良い拡張機能には設定オプションが必要です。引用をカスタマイズする方法を追加しましょう:

package io.mycompany.quarkus.random.quote.generator.runtime;

import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;

@ConfigRoot(name = "random-quote", phase = ConfigPhase.RUN_TIME)
public class RandomQuoteConfig {

    /**
     * ジェネレーターに追加するカスタム引用
     */
    @ConfigItem(name = "custom-quotes")
    public Optional<List<String>> customQuotes;
}

これでユーザーは自分の引用を追加できます。まるで自分の色を私たちの傑作に加えるための絵筆を渡すようなものです!

ステップ7:テスト - プロフェッショナルだから

拡張機能はテストなしでは完成しません。ジェネレーターが動作することを確認するための簡単なテストを書きましょう:

package io.mycompany.quarkus.random.quote.generator;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import jakarta.inject.Inject;

import static org.junit.jupiter.api.Assertions.assertNotNull;

@QuarkusTest
public class RandomQuoteGeneratorTest {

    @Inject
    RandomQuoteGenerator generator;

    @Test
    public void testRandomQuoteGeneration() {
        String quote = generator.getRandomQuote();
        assertNotNull(quote);
        System.out.println("Generated quote: " + quote);
    }
}

テストを実行することは、コードに健康診断を行うようなものです。安全第一です!

ステップ8:ドキュメント - 親切だから

最後に、ドキュメントを書きましょう。プロジェクトのルートにREADME.mdファイルを作成します:

# Quarkus Random Quote Generator Extension

この拡張機能は、Quarkusアプリケーションにランダムな引用ジェネレーターを追加します。

## 使用法

1. プロジェクトに拡張機能を追加します:

```xml
<dependency>
    <groupId>io.mycompany</groupId>
    <artifactId>quarkus-random-quote-generator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>
```

2. コードにジェネレーターを注入して使用します:

```java
@Inject
RandomQuoteGenerator generator;

public void printRandomQuote() {
    System.out.println(generator.getRandomQuote());
}
```

3. application.propertiesで引用をカスタマイズします:

```properties
quarkus.random-quote.custom-quotes=May the source be with you,I code, therefore I am
```

良いドキュメントは、よくコメントされたコードのようなもので、みんなの生活を楽にします。

グランドフィナーレ:拡張機能の公開

やりました!あなたの拡張機能は世界に向けて準備が整いました。公開するには:

  1. コードをGitHubにプッシュする
  2. CI/CDをセットアップする(GitHub Actionsが役立ちます)
  3. Maven Centralに公開する(共有は思いやりです)

まとめ

これで、アイデアからプロダクション対応のソリューションまで、あなた自身のQuarkus拡張機能が完成しました。まるでQuarkusの呪文書に新しい呪文を追加したかのようです。覚えておいてください、大いなる力には...まあ、続きは知っていますよね。

さあ、Quarkusを心ゆくまで拡張してください。あなたの拡張機能がQuarkusエコシステムの次の大きなものになるかもしれません。コーディングを楽しんで、ビルドが常に成功しますように!

「最高のコードはコードがないことだ。」 - ジェフ・アトウッド(でも素晴らしいQuarkus拡張機能には例外を作りましょう)