Vidocq Runtime adopte le vocabulaire d’extensions popularisé par Quarkus, mais l’implémente sur un socle 100 % JDK (CDI Lite via Vauban + Class-File API standard, JEP 484). Cette page définit les termes utilisés dans le reste de la documentation.
Extension
Une extension est un module Maven qui contribue au runtime via la SPI vidocq-runtime-spi. Elle se présente comme :
-
un fragment de bytecode et de configuration injecté dans la séquence de boot ;
-
une ou plusieurs classes annotées
@BuildStepqui s’exécutent à la compilation ; -
éventuellement un ou plusieurs
@Recorderqui produisent du bytecode rejoué au démarrage.
Une extension est statique : elle ne charge rien dynamiquement à l’exécution. Tout ce qu’elle apporte est résolu à mvn package.
Build step
Une build step est une méthode annotée @BuildStep dans une extension. Elle :
-
consomme zéro, un ou plusieurs
BuildItemen paramètres ; -
produit un ou plusieurs
BuildItemen valeur de retour ou viaBuildProducer<T>; -
s’exécute à la compilation, dans un graphe topologique calculé par
vidocq-runtime-core.
Le moteur d’orchestration garantit qu’une build step ne tourne qu’après la production de ses entrées et avant la consommation de ses sorties. Les paires producteur/consommateur définissent les arêtes du graphe.
BuildItem
Un BuildItem est l’unité d’échange entre build steps. Trois familles :
-
SimpleBuildItem— un seul producer autorisé (ex.JaxRsApplicationBuildItem) ; -
MultiBuildItem— N producers possibles (ex.BeanBuildItem,ResourceBuildItem) ; -
SymbolicBuildItem— marqueur de phase sans payload (ex.ApplicationStartBuildItem).
Recorder
Un recorder est une classe annotée @Recorder dont les invocations sont enregistrées plutôt qu’exécutées. À la compilation, chaque appel de méthode sur un recorder est sérialisé sous forme de bytecode invokevirtual dans une classe générée par Class-File API. Au démarrage, ce bytecode est rejoué — sans réflexion, sans proxy.
Les recorders distinguent deux phases :
-
@Record(STATIC_INIT)— exécuté tôt, dans le bloc statique de la classe générée ; -
@Record(RUNTIME_INIT)— exécuté au démarrage, après la lecture de la configuration externe.
Lifecycle phase
La séquence de boot Vidocq Runtime comporte cinq phases ordonnancées :
-
Config — résolution des sources MicroProfile Config, surcharge externe.
-
Extensions init — chaque extension reçoit
ExtensionContextet publie sesBuildItemruntime. -
CDI start — Vauban démarre le
BeanManager(les beans ont déjà été indexés au build). -
Transport bind — Chappe ouvre les listeners HTTP/1.1, H2, H3 selon la config.
-
Routes register — Cassini et Foy enregistrent ressources REST et servlets ; Mansart ouvre le pool JDBC.
Différences notables avec Quarkus
| Aspect | Quarkus | Vidocq Runtime |
|---|---|---|
CDI runtime |
ArC (custom) |
Vauban (CDI 4.1 Lite, TCK 774/774) |
Génération bytecode |
Gizmo (ASM) |
Class-File API JDK (JEP 484) |
Transport HTTP |
Vert.x |
Chappe sur virtual threads |
JSON |
Jackson |
Champollion (JSON-B 3.0) |
Persistence |
Hibernate ORM/Reactive |
Mansart (Jakarta Data 1.0 + JDBC) |
JDK minimum |
17 |
25 (LTS) |
JPMS natif |
Non |
Oui — |
Composition des six briques
Vidocq Runtime n’invente aucun runtime ; il compose les six briques fondatrices. Une extension vidocq-runtime-cassini-rest-extension enregistre par exemple un build step qui :
-
consomme
CdiBeanIndexBuildItemproduit parvidocq-runtime-vauban-extension; -
déclenche la génération du routage statique de Cassini ;
-
produit
HttpRouteBuildItemconsommé parvidocq-runtime-chappe-webserver-extension.
C’est cette grammaire de BuildItem qui rend l’écosystème homogène alors que chaque brique reste autonome dans son propre repo.
Pour aller plus loin
-
Fonctionnement interne — la séquence de boot pas-à-pas
-
SPI — comment écrire une extension
-
Référence — annotations et BuildItem standard