Ravel est l’implémentation MicroProfile Config 3.1 de l’écosystème Vidocq. Elle implémente la couche d’abstraction de configuration pour les applications Jakarta EE / MicroProfile : agrégation de multiples sources (propriétés système, variables d’environnement, microprofile-config.properties), conversion de types, expressions de propriété, profils de configuration, et intégration CDI via Vauban. Objectif : conformance 100 % au TCK MicroProfile Config 3.1, zéro dépendance externe, JPMS strict, prête pour jlink.

Origine du nom

Maurice Ravel (1875–1937) était maître de l’orchestration — il savait tisser des sources disparates (cordes, vents, percussions) en un tout cohérent et hiérarchisé. C’est exactement ce que fait un système de configuration : agréger des sources hétérogènes (fichiers, variables d’environnement, propriétés système) en une configuration unifiée.

Référence : Ravel sur Wikipedia.

Ravel, le compositeur

Ravel, le runtime de configuration

Pupitre des cordes

Propriétés système

Pupitre des vents

Variables d’environnement

Pupitre des percussions

microprofile-config.properties et sources personnalisées

Partition d’orchestration

Hiérarchie des sources de configuration (ordinal)

Résolution harmonique

Convertisseurs et convertisseurs implicites

Développement thématique

Expressions de propriété (${key}, ${key:default})

Structure des mouvements

Profils de configuration (%dev., %prod., %test.)

Ravel orchestre toutes ces voix en une configuration unique et unifiée, accessible via ConfigProvider.getConfig() et optionnellement injectée via CDI avec @ConfigProperty.

Coup d’œil rapide

Spec implémentée

https://microprofile.io/specifications/microprofile-config/

Dépôt

https://codeberg.org/Vidocq/ravel

Java

25 (LTS)

Modules JPMS

org.eclipse.microprofile.config (repackagé), io.vidocq.ravel.api, io.vidocq.ravel.core, io.vidocq.ravel.cdi.vauban

Dépendances runtime

Spec MicroProfile Config uniquement. CDI optionnel via Vauban.

Prête pour jlink

✅ — toutes les dépendances ont un module-info explicite, pas de fallback Automatic-Module-Name.

TCK

✅ Objectif : 100 % PASS (M5 — mai 2026).

Position dans l’écosystème

flowchart LR
  App["Votre application<br/>injection @ConfigProperty"]
  App -->|ConfigProvider.getConfig| Ravel["Ravel<br/>MicroProfile Config"]
  Ravel -->|cascading lookup| SysProp["Propriétés système<br/>ordinal: 400"]
  Ravel -->|cascading lookup| EnvVar["Variables d'environnement<br/>ordinal: 300"]
  Ravel -->|cascading lookup| Props["microprofile-config.properties<br/>ordinal: 100"]
  Ravel -->|cascading lookup| Custom["ConfigSource personnalisé<br/>via SPI"]

  Ravel -->|@Inject| Vauban["Vauban<br/>CDI Lite"]

  Ravel -->|conversion de types| Converters["Convertisseurs built-in<br/>primitifs, collections, temporels, etc."]
  Ravel -->|résolution de propriétés| Expressions["Expressions de propriété<br/>${key}, ${key:default}"]
  Ravel -->|matching de profils| Profiles["Profils de configuration<br/>%dev., %prod., %test."]

Caractéristiques principales

Zéro dépendance externe

Seulement org.eclipse.microprofile.config comme dépendance de compilation. L’implémentation est entièrement autonome, sans Smallrye, Guava ou autres libs tierces. Parfait pour les microservices et les environnements embarqués.

JPMS strict

Tous les modules ont un module-info.java explicite, pas de fallback de module automatique. Les packages internes ne sont pas exportés. Compatible avec jlink pour générer des images JDK personnalisées.

Convertisseurs de types built-in

Support des primitifs, boxés, String, URL, URI, InetAddress, Duration, Period, types temporels, énumérations, tableaux et collections — avec convertisseurs implicites pour les types personnalisés via constructeurs publics ou méthodes valueOf() / parse().

Expressions de propriété

Support des références de propriétés avec ${key} et valeurs par défaut via ${key:default}. Détection de cycles pour éviter les boucles infinies.

Profils de configuration

Configuration spécifique à l’environnement via les préfixes %dev., %prod., %test.. Les profils sont résolus au moment de la lookup, pas au moment de la compilation.

Intégration CDI (optionnel)

Injectez les valeurs de configuration directement dans les beans via @ConfigProperty("key") et @ConfigProperty("key") sur les champs Optional<T>. Alimenté par l’extension Vauban Build-Compatible.

Essayez-le

// Récupérer la Config
Config config = ConfigProvider.getConfig();
String value = config.getValue("my.property", String.class);
Optional<String> optValue = config.getOptionalValue("my.property", String.class);

// Avec CDI
@ApplicationScoped
public class MyApplication {
    @Inject
    @ConfigProperty("app.name")
    String appName;

    @Inject
    @ConfigProperty("app.port")
    int port;

    @Inject
    @ConfigProperty("app.debug")
    Optional<Boolean> debug;
}

Suivant : Prise en main.