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 |
|
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 ( |
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 |
|
Dépôt |
|
Java |
25 (LTS) |
Modules JPMS |
|
Dépendances runtime |
Spec MicroProfile Config uniquement. CDI optionnel via Vauban. |
Prête pour jlink |
✅ — toutes les dépendances ont un |
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.