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 |
|
Module JPMS |
|
Source |
|
Surface publique
Liste indexée à partir des sources existantes :
| Type | Rôle |
|---|---|
|
Interface marqueur pour |
|
API de contribution — registre de |
|
Interface lue au build pour résoudre les options propres à l’extension. |
|
Façade MicroProfile Config — |
|
Source de configuration (analogue MicroProfile, ré-exposée). |
|
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
-
Concepts — vocabulaire formel
-
Référence — table des SPI publiques
-
Extensions built-in — exemples concrets de SPI consommée