Puis-je utiliser un seul fichier war dans de multiples environnements? Devrais-Je?
J'ai une application web Java à mon travail et j'aimerais simplifier la façon dont nous déployer pour nos DEV, QA, et les environnements de PROD.
L'application lit dans une série de propriétés au démarrage, et les propriétés des fichiers sont différents pour les dev, qa, et prod. Chaque fois que je veux déployer à un certain environnement je baisse l'environnement spécifique de propriétés de fichier dans mon dossier app, construire la guerre, puis de la déployer à l'un des trois serveurs tomcat 5.5.
Ce que je voudrais faire est d'avoir un seul .la guerre qui a les propriétés de tous les milieux, et l'application est d'interroger le serveur pendant le processus init de comprendre que l'environnement de l'application est en cours, et donc les propriétés à charge. Est-il un moyen facile (ou, à défaut, d'une manière standard) pour le faire?
- Pour prendre un peu de recul, est-ce même un objectif souhaitable? Devrais-je essayer de créer un one-size-fits-all .la guerre en premier lieu?
- Voir aussi cette question: stackoverflow.com/questions/1568985/...
Vous devez vous connecter pour publier un commentaire.
Cela dépend vraiment de ce que vous êtes à l'aide de ces propriétés.
Certains (comme source de données, par exemple) peut être configuré dans le conteneur lui-même (Tomcat 5.5. Ressources JNDI, voir JDBC sources de section).
Autres (spécifique à l'application) peuvent en effet être des propriétés. Dans ce cas, vos choix sont:
WEB-INF/classes
(ou un autre endroit approprié).Autant que "est-ce un objectif souhaitable" va - oui, je le pense. Avoir un seul de la GUERRE de test QA /mise en scène et de la déployer à des baisses de production d'une étape intermédiaire et laisse donc moins de chances pour les erreurs.
Mise à jour (basé sur les commentaires):
Au point 1 ci-dessus fait référence à une variable d'environnement (par exemple, quelque chose que vous définissez via
SET ENV_NAME=QA
dans Windows ouENV_NAME=QA; export ENV_NAME
dans Linux). Vous pouvez le lire sa valeur à partir de votre code à l'aide deSystem.getenv()
et de charger les propriétés appropriées fichier:Mais oui, vous pouvez définir une valeur scalaire via JNDI (voir les Entrées d'Environnement dans Tomcat doc) à la place:
et de le lire à l'intérieur de votre application via
La chose est, si vous allez être en utilisant JNDI de toute façon, vous pourriez aussi bien renoncer à votre propriété des fichiers et tout configurer via JNDI. Vos sources de données seront disponibles pour vous en tant que ressources réelles et propriétés de base restera scalaires (bien qu'ils soient de type sécurisé).
En définitive, c'est à vous de décider ce qui est mieux pour vos besoins spécifiques; les deux ont des avantages et des inconvénients.
Ce que vous faites est un accident attendant d'arriver... un jour, un DEV de la guerre finira au serveur de PROD, et par une loi supérieure à toutes les lois de la nature que le problème sera détecté à 2H du matin. Ne peux pas expliquer pourquoi c'est le cas, mais un jour ça va se produire. Si une guerre est à mon avis une bonne idée.
Vous pouvez définir un système de propriété dans la JVM de l' (Dcom.votredomaine.configpath=/où/vous/store/configfiles) et aller chercher cette propriété avec
La valeur par défaut peut pointer quelque part à l'intérieur de la guerre (WEB-INF/...), ou si il n'y a pas de défaut, être utilisé pour faire des coupes de bruit au cours de la charge d'avertir pour une mauvaise configuration). Notez également que cette technique n'est pas dépendants de la plateforme, de sorte que vous dev machine peut être une zone de Windows et le serveur d'une machine Linux, il peut faire face à la fois. Nous avons l'habitude de créer un sous répertoire par application de cette configpath, comme plusieurs applications utilisent ce système sur un serveur, et nous voulons garder les choses en ordre.
Comme un bonus supplémentaire, vous ne risquez pas à la corbeille manuellement modifié propriété des fichiers sur un serveur de PROD de cette façon. Il suffit de ne pas oublier d'inclure le chemin où les fichiers sont stockés dans un scénario de sauvegarde.
Je pense que un seul fichier war est un bon moyen d'y aller, parce que c'est agréable d'avoir la confiance que le binaire vous testé le DEV est exactement la même que dans la Production. La manière dont nous le faisons, nous gardons les configurations dans un autre fichier de propriétés, à l'extérieur de la guerre, mais, dans l'application du serveur de chemin de classe.
Si vous voulez bien garder toutes les propriétés à l'intérieur de la guerre (ce qui ne veut faciliter le déploiement, car alors vous n'avez pas à également déployer un fichier de propriétés), vous pouvez garder un seul fichier de propriétés dans le classpath qui identifie le serveur type d'environnement, et de l'utiliser pour des valeurs de clé dans le fichier de propriétés au sein de votre .la guerre de fichier. L'externe propriétés de fichier peut également être une bonne voie à suivre pour peut-être certains de haut niveau des configurations qui ne changent pas et sont utilisés dans un certain nombre de fichiers war.
Probablement la façon la plus simple serait de créer une variable d'environnement qui diffère entre les services d'application et l'utiliser pour déterminer la propriété de fichier à lire.
Une autre possibilité serait de stocker les propriétés dans une base de données, et d'utiliser une source de données qui existe en vertu d'une norme nom JNDI, mais des points à un endroit différent dans les différents environnements.
Je préfère celle de l'OREILLE ou une GUERRE approche. Il y a quelque chose rassurante et souvent nécessaire d'un point de vue sécurité au sujet de traitement de la même OREILLE qui a été testé et en le déplaçant directement dans l'état suivant (test > Production).
Il y a également de nombreuses options en plus des propriétés de fichiers fournis par le conteneur. Souvent le conteneur a une belle INTERFACE utilisateur pour assurer le maintien de ces valeurs et de ressources lorsque vous êtes morts et disparus.
Il existe d'innombrables exemples de l'utilisation d'une base de données soutenu ResourceBundle.
Par exemple, le framework Spring dispose de plusieurs mécanismes pour le faire sans trop d'effort. En commençant par PropertyPlaceholderConfigurer
Définir un Systemproperty au démarrage qui pointe vers l'emplacement de votre fichier de propriétés, puis dans votre application tirez dans cette propriété et de chargement de vos paramètres. Une autre chose que je fais est d'avoir deux fichier de propriétés, quelque chose comme un défaut.propriétés et externe.les propriétés. Ils contiennent les mêmes propriétés, mais la valeur par défaut.propriétés contient la valeur par défaut(fonctionne la plupart du temps les paramètres), ce fichier va dans la guerre. Alors si vous déployez une env. vous recherchez le externe.propriétés, s'il est trouvé est utilisé, si non, alors vous revenir à la valeur par défaut.les propriétés. Cela fournit une belle façon de modifier les propriétés si nécessaire, mais aussi avoir une configuration par défaut. Ceci fonctionne dans beaucoup de mes déploiements, mais peut ne pas être dans votre scénario.
Absolument une seule GUERRE est la meilleure façon d'aller. Définir les ressources à l'aide des mêmes noms JNDI dans chaque environnement, et si vous avez besoin de détecter quel environnement vous êtes dans une logique d'entreprise à des fins, l'utilisation d'un Système de propriété sur le démarrage de Tomcat.
Une construction unique (la guerre) est certainement la bonne approche.
Cependant, quand il s'agit de l'environnement de configuration spécifique, la meilleure façon de le faire est de s'assurer que toute la configuration .les propriétés de fichiers ne doivent pas être poussés à tous les environnements. par exemple, PROD propriétés des fichiers doivent être copiés DEV ou de l'UAT.
Printemps profils doivent être évités car ils conduisent à alambiquée de gestion de la configuration.