Vue d’ensemble

Les profils de configuration vous permettent de définir des valeurs spécifiques à l’environnement sans changer le code. Les profils sont des clés préfixées dans les fichiers de propriétés et sont activés via la propriété système mp.config.profile.

Bases

Dans microprofile-config.properties ou toute source de configuration, préfixez une clé avec %{profile}. pour la rendre spécifique au profil :

# Par défaut (s'applique quand aucun profil n'est actif)
app.name=MyApp
app.debug=false
app.port=8080

# Profil de développement
%dev.app.debug=true
%dev.app.port=9000
%dev.app.log.level=DEBUG

# Profil de production
%prod.app.port=8443
%prod.app.log.level=INFO
%prod.app.https.enabled=true

Activez le profil dev :

java -Dmp.config.profile=dev MyApplication

Maintenant : - app.name → retourne toujours MyApp (pas de surcharge spécifique au profil) - app.debug → retourne true (de %dev.app.debug) - app.port → retourne 9000 (de %dev.app.port)

Comportement de repli

Si une clé spécifique au profil n’existe pas, Ravel bascule à la clé de base :

app.name=DefaultName
%dev.app.name=DevName

Avec mp.config.profile=dev : - app.name → cherche %dev.app.name (trouvé : DevName) → retourne DevName

Sans profil : - app.name → cherche la base app.name (trouvé : DefaultName) → retourne DefaultName

Plusieurs valeurs de profil

Seul un profil à la fois est actif (défini via mp.config.profile). Vous ne pouvez pas combiner plusieurs profils avec une seule lookup.

Cependant, vous pouvez basculer les profils dynamiquement :

// Lancer avec le profil dev
System.setProperty("mp.config.profile", "dev");
Config devConfig = ConfigProvider.getConfig();
String debugDev = devConfig.getValue("app.debug", String.class); // "true"

// Basculer à prod
System.setProperty("mp.config.profile", "prod");
Config prodConfig = ConfigProvider.getConfig();
String debugProd = prodConfig.getValue("app.debug", String.class); // "false"

Profils courants

Bien que vous puissiez définir n’importe quels noms de profils, voici les conventions courantes :

Profil Usage

dev

Développement : journalisation détaillée, endpoints localhost, sécurité désactivée

test

Test : bases de données en mémoire, services mockés

prod

Production : journalisation minimale, endpoints renforcés, TLS/HTTPS

staging

Pré-production : similaire à prod mais avec endpoints de staging

Priorité des profils

Quand plusieurs sources de configuration définissent la même clé, l’ordinal s’applique toujours :

# SystemPropertiesConfigSource (ordinal 400)
-Dapp.name=CliOverride

# EnvironmentVariablesConfigSource (ordinal 300)
APP_NAME=EnvValue

# microprofile-config.properties (ordinal 100)
app.name=FileValue
%dev.app.name=DevFileValue

Avec mp.config.profile=dev :

  1. Cherche la propriété système -Dapp.name (ordinal 400) → trouvé : CliOverrideretourner

  2. (les chèques de var env et de fichier sont sautés ; déjà trouvé)

Sans profil, la même précédence s’applique :

  1. Cherche -Dapp.name → trouvé : CliOverrideretourner

Les préfixes de profil sont transparents à la logique d’ordinal — seul l’ordinal compte pour la priorité entre les sources.

Avec expressions de propriété

Les expressions sont résolues après la correspondance des profils :

# Configuration de base de base de données
db.host=prod-db.example.com
db.user=app_user
db.jdbc.url=jdbc:postgresql://${db.host}:5432/appdb?user=${db.user}

# Les surcharges du profil dev
%dev.db.host=localhost
%dev.db.user=dev_user
# L'expression db.jdbc.url utilisera les valeurs résolues (spécifiques au profil)

Avec mp.config.profile=dev : - db.jdbc.url se résout à jdbc:postgresql://localhost:5432/appdb?user=dev_user

Intégration CDI

Avec l’intégration CDI, @ConfigProperty respecte les profils :

@ApplicationScoped
public class AppConfig {
    @Inject
    @ConfigProperty("app.debug")
    boolean debug;

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

// Avec mp.config.profile=dev :
// - debug = true (de %dev.app.debug)
// - port = 9000 (de %dev.app.port)

Exemple : Déploiement multi-étapes

# Commun
app.name=PaymentService
app.version=2.1.0
db.pool.size=10

# Développement
%dev.app.log.level=DEBUG
%dev.db.host=localhost
%dev.db.port=5432
%dev.api.endpoint=http://localhost:8080

# Staging
%staging.app.log.level=INFO
%staging.db.host=staging-db.internal
%staging.db.port=5432
%staging.api.endpoint=https://staging-api.example.com
%staging.db.pool.size=20

# Production
%prod.app.log.level=WARN
%prod.db.host=prod-db.cluster.example.com
%prod.db.port=5432
%prod.api.endpoint=https://api.example.com
%prod.db.pool.size=50
%prod.tls.enabled=true

Déploiement avec :

# Développement
java -Dmp.config.profile=dev -jar app.jar

# Staging
java -Dmp.config.profile=staging -jar app.jar

# Production
java -Dmp.config.profile=prod -jar app.jar

Suivant