Nous avions un besoin de configuration similaire lors du déploiement d'une application web pour différents développeurs, et sur l'EC2 d'Amazon : comment séparer la configuration du code binaire ? D'après mon expérience, JNDI est trop complexe et varie trop entre les conteneurs pour être utilisé. En outre, l'édition manuelle de XML est très sensible aux erreurs de syntaxe, et l'idée a donc été rejetée. Nous avons résolu ce problème avec une conception basée sur quelques règles :
1) seules les entrées simples de type nom=valeur doivent être utilisées
2) les nouvelles configurations doivent pouvoir être chargées en changeant un seul paramètre.
3) notre binaire WAR doit être reconfigurable sans avoir à le reconditionner.
4) les paramètres sensibles (mots de passe) ne seront jamais emballés dans le binaire
L'utilisation de fichiers .properties pour toute la configuration, et l'utilisation de System.getPropert("domain");
pour charger les fichiers de propriétés appropriés, nous avons pu répondre aux exigences. Cependant, la propriété du système ne pointe pas vers une URL de fichier, à la place nous avons créé un concept que nous appelons "domaine" pour spécifier la configuration à utiliser. L'emplacement de la configuration est toujours :
$HOME/appName/config/$DOMAIN.properties
.
Ainsi, si je veux exécuter mon application en utilisant ma propre configuration, je démarre l'application en définissant le domaine à mon nom :
-Ddomain=jason
au démarrage, et l'application charge le fichier :
/home/jason/appName/config/jason.properties
Cela permet aux développeurs de partager les configurations afin de recréer le même état de l'application pour les tests et le déploiement sans recompilation ou reconditionnement. La valeur du domaine est ensuite utilisée pour charger les propriétés .properties à partir d'un emplacement standard, en dehors du WAR groupé.
Je peux recréer complètement l'environnement de production sur mon poste de travail en utilisant la configuration de production comme :
-Ddomain=ec2
qui se chargerait :
/home/jason/appName/config/ec2.properties
Cette configuration nous permet d'effectuer des cycles de développement, d'assurance qualité et de publication avec un seul ensemble de binaires compilés, en utilisant différentes configurations dans chaque environnement. Il n'y a pas de risque d'avoir des mots de passe/etc inclus dans les binaires, et les gens peuvent partager leurs configurations pour recréer les problèmes que nous rencontrons.