web-dev-qa-db-fra.com

Quel est le meilleur endroit pour stocker un fichier de configuration dans une Java (WAR))?

Je crée une application web (WAR) et la déploie sur Tomcat. Dans le webapp il y a une page avec un formulaire où un administrateur peut entrer des données de configuration. Je ne veux pas stocker ces données dans un SGBD, mais simplement dans un fichier XML sur le système de fichiers. Où le mettre?

Je voudrais mettre le fichier quelque part dans l'arborescence de répertoires où l'application elle-même est déployée. Mon fichier de configuration doit-il se trouver dans le répertoire WEB-INF? Ou le mettre ailleurs?

Et quel est le code Java à utiliser dans une servlet pour trouver le chemin absolu du répertoire? Ou peut-on y accéder avec un chemin relatif?

55
boes

Ce que nous faisons est de le placer dans un répertoire séparé sur le serveur (vous pouvez utiliser quelque chose comme/config,/opt/config,/root/config,/home/username/config, ou tout ce que vous voulez). Lorsque nos servlets démarrent, ils lisent le fichier XML, en retirent quelques éléments (surtout les informations de connexion DB), et c'est tout.

J'ai demandé pourquoi nous l'avions fait une fois.

Ce serait bien de tout stocker dans la base de données, mais évidemment vous ne pouvez pas stocker les informations de connexion à la base de données dans la base de données.

Vous pouvez coder en dur des éléments dans le code, mais c'est moche pour de nombreuses raisons. Si les informations doivent changer, vous devez reconstruire le code et redéployer. Si quelqu'un obtient une copie de votre code ou de votre fichier WAR, il obtiendrait alors ces informations.

Mettre des choses dans le fichier WAR semble bien, mais si vous voulez beaucoup changer les choses, ce pourrait être une mauvaise idée. Le problème est que si vous devez modifier les informations, la prochaine fois que vous les redéployez, elles écraseront le fichier afin que tout ce que vous ne vous souvenez pas de changer dans la version intégrée au WAR soit oublié.

Le fichier dans un endroit spécial sur le système de fichiers fonctionne très bien pour nous. Il n'a pas de gros inconvénients. Vous savez où il se trouve, il est stocké séparément, ce qui facilite le déploiement sur plusieurs machines si elles ont toutes besoin de valeurs de configuration différentes (car cela ne fait pas partie du WAR).

La seule autre solution à laquelle je peux penser qui fonctionnerait bien serait de tout garder dans la base de données, à l'exception des informations de connexion à la base de données. Cela proviendrait de Java propriétés du système qui sont récupérées via la JVM. C'est la chose API de préférences mentionnée par Hans Doggen ci-dessus. Je ne pense pas que cela existait lorsque notre application a été développée pour la première fois, si c'était qu'il n'était pas utilisé.

Quant au chemin d'accès au fichier de configuration, c'est juste un fichier sur le système de fichiers. Vous n'avez pas à vous soucier du chemin Web. Ainsi, lorsque votre servlet démarre, il ouvre simplement le fichier dans "/config/myapp/config.xml" (ou autre) et il trouvera la bonne chose. Le simple codage en dur du chemin pour celui-ci me semble assez inoffensif.

48
MBCook

WEB-INF est un bon endroit pour mettre votre fichier de configuration. Voici du code pour obtenir le chemin absolu du répertoire à partir d'un servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
16
Jataro

Le mettre dans WEB-INF masquera le fichier XML aux utilisateurs qui tentent d'y accéder directement via une URL, donc oui, je dirais de le mettre dans WEB-INF.

9
Michael

Je ne le stockerais pas dans le dossier de l'application, car cela remplacerait la configuration avec un nouveau déploiement de l'application.

Je vous suggère de jeter un œil à l'API Préférences ou d'écrire quelque chose dans le dossier utilisateurs (l'utilisateur qui exécute Tomcat).

5
Hans Doggen

La réponse à cette question dépend de la façon dont vous avez l'intention de lire et d'écrire ce fichier de configuration.

Par exemple, le framework Spring vous donne la possibilité de tiliser des fichiers de configuration XML (ou Java); ceux-ci peuvent être stockés dans votre chemin de classe (par exemple, dans le Répertoire WEB-INF), n'importe où ailleurs sur le système de fichiers, ou même en mémoire. Si vous deviez utiliser Spring pour cela, alors l'endroit le plus simple pour stocker le fichier de configuration se trouve dans votre répertoire WEB-INF, puis utilisez Spring ClassPathXmlApplicationContext classe pour accéder à votre fichier de configuration.

Mais encore une fois, tout dépend de la façon dont vous prévoyez d'accéder à ce fichier.

3
delfuego

Si c'est votre configuration personnalisée WEB-INF est un bon endroit pour cela. Mais certaines bibliothèques peuvent nécessiter des configurations pour résider dans WEB-INF/classes.

1
axk