Comment puis-je stocker les paramètres de configuration Java EE en dehors d'un EAR ou WAR?

StackOverflow https://stackoverflow.com/questions/965061

Question

Je veux stocker la configuration pour un projet web en dehors du projet Web (oreille / fichier de guerre). L'application ne devrait pas savoir dans quel conteneur il fonctionne (WebSphere / JBoss, etc.).

Quelle est la meilleure façon de gérer cela?

est JNDI une manière propre? Si JNDI peut résoudre mes problèmes, comment dois-je configurer? (Objets personnalisés?)

Dans mon cas, ne sont là que simples paires clé => valeur (String, String) pour les points finaux SOAP / WS.

Était-ce utile?

La solution

Voir cette question pour les propriétés de lecture du fichier en dehors du fichier WAR.

Voir cette question pour la lecture des valeurs variables de JNDI. Je crois que c'est la meilleure solution. Vous pouvez lire une variable String avec ce code:

Context initialContext = new InitialContext();
String myvar = (String) initialContext.lookup("java:comp/env/myvar");

Le code ci-dessus fonctionnera sur tous les conteneurs. Dans Tomcat vous déclarez les éléments suivants dans le fichier conf / server.xml:

<GlobalNamingResources ...>
  <Environment name="myvar" value="..."
         type="java.lang.String" override="false"/>
</GlobalNamingResources>

Ce qui précède va créer une ressource globale. Il est également possible de définir une ressource dans le contexte de l'application. Dans la plupart des conteneurs, les ressources JNDI sont disponibles par le biais d'une console de gestion MBeans. Certains d'entre eux offrent une interface graphique pour les modifier. Tout au plus un redémarrage de l'application est nécessaire, lorsqu'une modification est apportée.

Comment les ressources JNDI sont définies et est édité conteneur spécifique. Il est d'appliquer les paramètres appropriés au travail du configurateur / administrateur.

Ce sont les avantages offerts par JNDI:

  • Vous pouvez définir des valeurs par défaut des paramètres dans le fichier WAR / EAR.
  • Les paramètres sont facilement configurable au niveau du conteneur.
  • Vous n'avez pas besoin de redémarrer le conteneur lorsque vous modifiez la valeur d'un paramètre.

Autres conseils

Nous avons eu une exigence de configuration similaire lors du déploiement d'une application Web pour les développeurs différents, et sur EC2 d'Amazon: comment configuration séparée du code binaire? Dans mon expérience, JNDI est trop complexe, et varie trop entre les conteneurs à utiliser. En outre, XML main-édition est très sensible aux erreurs de syntaxe, donc était l'idée a été rejetée. Nous avons résolu ce avec un design basé sur quelques règles:

1) seulement simple name = entrées de valeur doivent être utilisées

2) de nouvelles configurations doivent être chargeable en changeant un seul paramètre

3) notre binaire WAR doit être reconfigurable w / o reconditionner

4) paramètres sensibles (mots de passe) ne seront jamais empaquetés dans le binaire

Utilisation .properties pour toute la configuration et l'utilisation de System.getProperty("domain"); pour charger les fichiers de propriétés appropriées, nous avons pu répondre aux exigences. Cependant, la propriété du système ne pointe pas vers une URL de fichier, au lieu que 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.

Donc, si je veux courir mon application avec ma propre configuration, je commence 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 des configurations afin que nous puissions recréer le même état de l'application pour le test et le déploiement sans recompiler ou reconditionner. La valeur de domaine est ensuite utilisée pour charger .properties à partir d'un emplacement standard, en dehors du WAR fourni.

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 charge:
/home/jason/appName/config/ec2.properties

Cette configuration nous permet de faire des cycles dev / AQ / libération avec exactement -one- ensemble de binaires compilés, en utilisant différentes configurations dans chaque environnement. Il n'y a aucun risque de mots de passe / etc ayant regroupés dans les binaires, et les gens peuvent partager leurs configurations pour recréer les problèmes que nous voyons.

J'utilise une variable d'environnement pour pointer vers une URL (ce qui est probablement un fichier: // URL) qui a ma configuration en elle. Ceci est très simple à installer et ne nécessite pas l'infrastructure JNDI.

Voici quelques exemples de code (tapé de la mémoire - je ne l'ai pas compilé / testé):

public void loadConfiguration() {
   String configUrlStr = System.getenv("CONFIG_URL"); // You'd want to use a more
                                                      // Specific variable name.
   if(configUrlStr == null || configUrlStr.equals("") {
       // You would probably want better exception handling, too.
       throw new RuntimeException("CONFIG_URL is not set in the environment."); 
   }


   try {
       URI uri = new URI(configUrlStr);
       File configFile = new File(uri);
       if(!configFile.exists()) {
          throw new RuntimeException("CONFIG_URL points to non-existant file");
       }
       if(!configFile.canRead()) {
          throw new RuntimeException("CONFIG_URL points to a file that cannot be read.");
       }
       this.readConfiguration(configFile);
   } catch (URISyntaxException e) {
       throw new RuntimeException("Malformed URL/URI in CONFIG_URL");
   }



}

vous pouvez simplement stocker est alors un fichier de propriétés Java normal qui est sur le chemin de classe et il suffit de charger les propriétés?

il est simple et assez simple .. à moins que je manque quelque chose

Mes endroits préférés sont: des variables d'environnement et fichiers de propriétés

(comme suggéré par Jared et kgiannakakis ci-dessus.)

Tableau de base de données stockant des propriétés d'environnement

Cependant, une autre des solutions plus simples est d'avoir table de base de données stockant les propriétés de l'environnement.

Si votre application utilise la base de données

  • ce qui est relativement facile à installer
  • cède le pas vraiment facile à contrôler / modifier les valeurs
  • Il peut être intégré dans le processus et en en faisant partie de scripts DB
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top