vidocq-runtime-spi expose les interfaces et annotations qu’une extension consomme pour contribuer au runtime. C’est le seul module qu’une extension utilisateur doit déclarer en requires JPMS.

Coordonnées

Artefact

io.vidocq.runtime:vidocq-runtime-spi:0.1.0-SNAPSHOT

Module JPMS

io.vidocq.runtime.spi

Source

vidocq-runtime-spi/src/main/java/io/vidocq/runtime/spi/

Surface publique

Liste indexée à partir des sources existantes :

Type Rôle

VidocqExtension

Interface marqueur pour ServiceLoader. Une extension implémente configure(ExtensionContext).

ExtensionContext

API de contribution — registre de BuildItem, accès configuration, phase courante.

VidocqConfiguration

Interface lue au build pour résoudre les options propres à l’extension.

config.VidocqConfig

Façade MicroProfile Config — getValue(), getOptionalValue(), Converter<T>, ConfigSource.

config.ConfigSource

Source de configuration (analogue MicroProfile, ré-exposée).

config.Converter<T>

Conversion typée des valeurs de configuration.

Écrire une extension — squelette

package com.example.greeting;

import io.vidocq.runtime.spi.VidocqExtension;
import io.vidocq.runtime.spi.ExtensionContext;
import io.vidocq.runtime.spi.config.VidocqConfig;

public class GreetingExtension implements VidocqExtension {

    @Override
    public void configure(ExtensionContext ctx) {
        VidocqConfig cfg = ctx.config();
        String prefix = cfg.getValue("greeting.prefix", String.class);

        ctx.produce(new GreetingPrefixBuildItem(prefix));
    }
}

Déclaration JPMS dans module-info.java :

module com.example.greeting {
    requires io.vidocq.runtime.spi;

    provides io.vidocq.runtime.spi.VidocqExtension
        with com.example.greeting.GreetingExtension;
}

C’est tout. Le vidocq-runtime-maven-plugin détecte le provides JPMS, indexe l’extension et l’inclut dans le bootstrap généré.

Modèle de pureté des build steps

Une @BuildStep doit être :

  • déterministe — pour deux entrées identiques, sortie identique ;

  • pure — aucun effet de bord en dehors des BuildProducer ;

  • idempotente — re-jouable sans conséquence.

Cette discipline garantit que le bytecode généré est reproductible et compatible avec les caches Maven et les artefacts immuables.

Recorders

Un recorder est une classe @Recorder dont les méthodes sont enregistrées plutôt qu’exécutées. Le moteur génère, pour chaque appel, un fragment de bytecode invokevirtual dans la classe RuntimeBootstrap. Voir Fonctionnement interne pour la mécanique complète.

@Recorder
public class GreetingRecorder {
    public RuntimeValue<Greeter> create(String prefix) {
        return new RuntimeValue<>(new Greeter(prefix));
    }
}

Pour aller plus loin