web-dev-qa-db-fra.com

Lecture des propriétés de tomcat

Quelle est la meilleure pratique pour lire les fichiers de configuration de votre application? Quels dossiers du serveur Tomcat se trouvent "sur le chemin de classe".

J'ai essayé de placer mon fichier de configuration dans le Tomcat_HOME\conf mais je ne parviens toujours pas à le lire depuis mon servlet.

J'ai essayé d'utiliser ceci (il y a un fichier app.properties dans conf):

this.getClass().getClassLoader().getResourceAsStream("/app.properties");

Je n'ai pas beaucoup de propriétés peut-être 10-15, j'ai pensé que ce ne serait pas un problème. Je me souviens que lorsque j’utilisais jboss, cela n’était pas aussi grave.

Dans mon application, je spécifie également le ressort de connexion à la base de données dans le context.xml. Puis-je spécifier mes propriétés également? Ou comment cela fonctionne avec tomcat? 

Je voudrais que mes propriétés soient séparées de ma guerre/guerre non conditionnée.

Mettre à jour

La raison pour demander ceci est parce que je ne sais pas où mon application sera déployée (à quel emplacement)

12
Gandalf StormCrow

Il y a beaucoup de façons différentes mais cela dépend de vos besoins:

Pour charger un fichier de propriétés à partir du répertoire $Tomcat_HOME/conf, vous devez y accéder à l'aide d'un objet Java.io.File, car le chargeur de classes (comme dans this.getClass().getClassLoader().getResourceAsStream(...) peut charger des fichiers (et des classes) à partir de votre chemin d'accès aux classes (sous WEB-INF/classes, WEB-INF/lib ou $Tomcat_HOME/lib).

L'exemple le plus simple pour charger un fichier à partir du répertoire de configuration de Tomcat serait:

File configDir = new File(System.getProperty("catalina.base"), "conf");
File configFile = new File(configDir, "myconfig.properties");
InputStream stream = new FileInputStream(configFile);
Properties props = new Properties();
props.load(stream);

Notez que cette approche rend votre code dépendant de Tomcat (le mécanisme de chargement dépend du fait que la propriété système de Tomcat est disponible). C'est quelque chose que je ne recommanderais pas du tout donc si vous déplacez votre fichier de propriétés dans un dossier de votre chemin d'accès aux classes alors vous devriez pouvoir le charger comme vous l'avez essayé et votre application pourrait être déployée dans n'importe quel conteneur.

Vous pouvez également configurer vos propriétés en tant que ressources JNDI, mais il serait trop compliqué d’y accéder.

21
Alonso Dominguez

Plutôt que de faire référence à l'emplacement d'un fichier de configuration particulier, j'utiliserais une configuration liée à JNDI pour que les applications restent dépendantes des données de configuration et des normes Java EE uniquement. Je peux voir deux options:

  1. Si vous ne disposez que d'un nombre modéré d'entrées de configuration dans votre fichier de propriétés, envisagez de les créer Environment Entries et accédez-y via JNDI dans vos applications. 

  2. Par exemple, si vous souhaitez conserver vos propriétés dans un fichier de propriétés séparé, vous pouvez également créer un bean pour représenter les propriétés, une fabrique (l'initialiser à l'aide d'un fichier de propriété) et le connecter à JNDI en tant que Définition de ressource .
    Avec cela, on pourrait même être en mesure de relire régulièrement le fichier de propriétés sans avoir besoin de redémarrer les applications, de basculer entre diverses sources de configuration ou d’autres exigences similaires.

Chacune des applications Web utilisant cette configuration devra inclure un Référence de la ressource dans son web.xml pour faire référence au bean de configuration (ou une référence à chaque entrée env. Si l'option 1 est utilisée).

1
david a.

Placez vos fichiers dans le WEB-INF/classes de votre application Web. C'est le répertoire classpath par défaut. conf si pour les internes de Tomcat uniquement.

1
Michael-O

Autant que je sache, vous pouvez également configurer datasource dans Tomcat. DataSource dans Tomcat

Après cela, vous pouvez utiliser datasource dans votre application.

0
Amit Deshpande

Même s’il s’agit peut-être d’un PITA, c’est probablement aussi une fonction dont vous ne savez pas où elle sera déployée. Vous ne pouvez pas vous "coupler" à ce fait alors!

Selon le reste de votre pile Java, la meilleure solution est généralement indépendante de Tomcat. Si vous utilisez Spring, vous pouvez par exemple dire: 

new ClassPathResource("**/myFile.properties")

ou si vous utilisez Java Config, un autre exemple:

@PropertySource("classpath:META-INF/MyWeb.properties")

En Java simple, vous pouvez dire:

InputStream stream = loader.getResourceAsStream(resourceName);

où loader est une instance de ClassLoader

0
JoeG

add .properties file in Apache-Tomcat-7.0.78\conf folderFile configDir = new File(System.getProperty("catalina.base"), "conf");File configFile = new File(configDir, "dashboardiframes.properties");InputStream stream = new FileInputStream(configFile);Properties properties = new Properties(); properties.load(stream);

0
Srinivas Thouti