Pourquoi des extensions personnalisées ? Parce que nous le pouvons !

Admettons-le : les solutions prêtes à l'emploi ne suffisent pas toujours. Parfois, il faut retrousser ses manches et créer quelque chose sur mesure. C'est là qu'interviennent les extensions personnalisées de Quarkus. Elles sont comme la sauce secrète qui rend votre application unique et puissante.

"Un grand pouvoir implique de grandes responsabilités" – Oncle Ben (et tous les développeurs Quarkus)

Les ingrédients de notre potion d'extension

Avant de plonger, rassemblons nos outils :

  • Une pincée de créativité (ne vous inquiétez pas, nous en avons en abondance)
  • Quarkus (évidemment)
  • Jakarta EE (notre fidèle acolyte)
  • Une touche de patience (croyez-moi, vous en aurez besoin)

Étape 1 : Conceptualiser votre extension

Tout d'abord, que voulez-vous que votre extension fasse ? Pour ce tutoriel, créons quelque chose de ludique et utile : une extension "RandomQuoteGenerator". Parce que qui n'a pas besoin d'une dose de sagesse (ou de folie) dans son code ?

Étape 2 : Configurer le projet

Il est temps de se salir les mains. Ouvrez votre terminal et créons un nouveau projet d'extension Quarkus :

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

Cette commande crée une structure de base pour notre extension. C'est comme la fondation d'une maison – pas très excitant pour l'instant, mais essentiel.

Étape 3 : Implémenter la fonctionnalité principale

Maintenant, ajoutons de la substance. Nous allons créer une classe RandomQuoteGenerator qui fera le gros du travail :

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(
        "Je ne suis pas un grand programmeur ; je suis juste un bon programmeur avec de bonnes habitudes." - Kent Beck,
        "Parler est bon marché. Montrez-moi le code." - Linus Torvalds,
        "La programmation ne concerne pas ce que vous savez ; c'est ce que vous pouvez découvrir." - Chris Pine
    );

    private final Random random = new Random();

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

Regardez cette belle annotation Jakarta CDI (@ApplicationScoped). C'est comme si nous donnions des super-pouvoirs à notre classe !

Étape 4 : Créer le module d'exécution

Ensuite, nous devons configurer le module d'exécution. C'est là que la magie opère lorsque quelqu'un utilise notre extension :

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();
    }
}

Cette classe de recorder est comme l'équipe en coulisses d'un théâtre – elle met tout en place derrière la scène.

Étape 5 : Module de déploiement - Là où les pièces se rejoignent

Maintenant, créons le module de déploiement. C'est ici que nous disons à Quarkus comment intégrer notre extension :

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();
    }
}

Ce processeur est comme le chef d'orchestre, s'assurant que toutes les parties de notre extension jouent ensemble harmonieusement.

Étape 6 : Configuration

Toute bonne extension a besoin d'options de configuration. Ajoutons un moyen de personnaliser nos citations :

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 {

    /**
     * Citations personnalisées à ajouter au générateur
     */
    @ConfigItem(name = "custom-quotes")
    public Optional<List<String>> customQuotes;
}

Maintenant, les utilisateurs peuvent ajouter leurs propres citations. C'est comme leur donner un pinceau pour ajouter leurs propres couleurs à notre chef-d'œuvre !

Étape 7 : Tests - Parce que nous sommes des professionnels

Aucune extension n'est complète sans tests. Écrivons un test simple pour nous assurer que notre générateur fonctionne :

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);
    }
}

Faire des tests, c'est comme donner un bilan de santé à votre code. Mieux vaut prévenir que guérir !

Étape 8 : Documentation - Parce que nous sommes sympas

Enfin, écrivons de la documentation. Créez un fichier README.md à la racine de votre projet :

# Extension Quarkus Random Quote Generator

Cette extension ajoute un générateur de citations aléatoires à votre application Quarkus.

## Utilisation

1. Ajoutez l'extension à votre projet :

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

2. Injectez et utilisez le générateur dans votre code :

```java
@Inject
RandomQuoteGenerator generator;

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

3. Personnalisez les citations dans votre application.properties :

```properties
quarkus.random-quote.custom-quotes=Que la source soit avec vous,Je code, donc je suis
```

Une bonne documentation, c'est comme un code bien commenté – cela facilite la vie de tout le monde.

Le grand final : Publier votre extension

Vous l'avez fait ! Votre extension est prête à affronter le monde. Pour la publier :

  1. Envoyez votre code sur GitHub
  2. Configurez CI/CD (GitHub Actions sont vos amis)
  3. Publiez sur Maven Central (parce que partager, c'est prendre soin)

Conclusion

Et voilà – votre propre extension Quarkus, de l'idée à la solution prête pour la production. C'est comme si vous veniez d'ajouter un nouveau sort au livre de sorts de Quarkus. Rappelez-vous, un grand pouvoir implique... eh bien, vous connaissez la suite.

Allez maintenant, étendez Quarkus à votre guise. Qui sait ? Votre extension pourrait bien être la prochaine grande chose dans l'écosystème Quarkus. Bon codage, et que vos builds soient toujours réussis !

"Le meilleur code est celui qui n'existe pas." - Jeff Atwood (mais nous ferons une exception pour les extensions Quarkus géniales)