78 votes

Comment puis-je spécifier les propriétés du système dans la configuration de Tomcat au démarrage ?

Je comprends que je peux spécifier les propriétés du système à Tomcat en passant des arguments avec le paramètre -D, par exemple " -Dmy.prop=valeur ".

Je me demande s'il n'existe pas un moyen plus propre de le faire en spécifiant les valeurs des propriétés dans le fichier context.xml ou dans un autre fichier de configuration de Tomcat. Je voudrais faire cela parce que, premièrement, il est plus facile de garder la trace de mes propriétés, et deuxièmement, j'ai plusieurs contextes en cours d'exécution et je ne sais pas comment je pourrais spécifier les propriétés spécifiques au contexte par le biais du paramètre -D.

J'utilise la version 5.5 de Tomcat.

Merci d'avance.

29voto

netjeff Points 3633

cliff.meyers à utiliser pour propriétés du système sera no travailler avec System.getProperty()

Selon la documentation de Tomcat 6.0 <env-entry> est pour JNDI . Cela signifie donc que cela n'aura pas d'effet sur System.getProperty() .

Utilisation de cliff.meyers Dans l'exemple de l'entreprise, le code suivant

System.getProperty("SMTP_PASSWORD");

retournera null, et non la valeur "abc123ftw".

Selon la documentation de Tomcat 6, l'utilisation de l'option cliff.meyers Dans le cas de l'exemple de l'entreprise, il faudrait écrire un code comme celui-ci pour utiliser l'outil <env-entry> :

// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// Look up our data source
String s = (String)envCtx.lookup("SMTP_PASSWORD");

Avertissement : je n'ai pas réellement essayé l'exemple ci-dessus. Mais je ont a essayé <env-entry> avec System.getProperty(), et cela ne fonctionne absolument pas.

14voto

cliff.meyers Points 10394

(Mise à jour : Si je pouvais supprimer cette réponse, je le ferais, mais comme elle a été acceptée, je ne peux pas. Je mets à jour la description pour fournir de meilleurs conseils et décourager les gens d'utiliser la mauvaise pratique que j'ai décrite dans la réponse originale).

Vous pouvez spécifier ces paramètres via des paramètres de contexte ou d'environnement, comme dans context.xml. Consultez les sections intitulées "Paramètres de contexte" et "Entrées d'environnement" sur cette page :

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

Comme le souligne @netjeff, ces valeurs seront disponibles via la méthode Context.lookup(String) et non comme paramètres du système.

Une autre façon de spécifier ces valeurs est de définir des variables dans le fichier web.xml de l'application web que vous déployez (voir ci-dessous). Comme le souligne @Roberto Lo Giacco, ceci est généralement considéré comme une mauvaise pratique puisqu'un artefact déployé ne devrait pas être spécifique à un environnement. Cependant, vous trouverez ci-dessous le snippet de configuration si vous souhaitez vraiment le faire :

<env-entry>
    <env-entry-name>SMTP_PASSWORD</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>abc123ftw</env-entry-value>
</env-entry>

13voto

basicEntity Points 91

Il est également possible de laisser un ServletContextListener définir les propriétés du système :

import java.util.Enumeration;
import javax.servlet.*;

public class SystemPropertiesHelper implements
        javax.servlet.ServletContextListener {
    private ServletContext context = null;

    public void contextInitialized(ServletContextEvent event) {
        context = event.getServletContext();
        Enumeration<String> params = context.getInitParameterNames();

        while (params.hasMoreElements()) {
          String param = (String) params.nextElement();
          String value = 
            context.getInitParameter(param);
          if (param.startsWith("customPrefix.")) {
              System.setProperty(param, value);
          }
        }
    }

    public void contextDestroyed(ServletContextEvent event) {
    }
}

Et puis mettez ceci dans votre web.xml (cela devrait être possible pour context.xml aussi)

<context-param>
        <param-name>customPrefix.property</param-name>
        <param-value>value</param-value>
        <param-type>java.lang.String</param-type>
</context-param>

<listener>
    <listener-class>servletUtils.SystemPropertiesHelper</listener-class>    
</listener>

Ça a marché pour moi.

13voto

Olaf Kock Points 18072

En général, vous ne devriez pas compter sur les propriétés du système pour configurer une application web - elles peuvent être utilisées pour configurer le conteneur (par exemple Tomcat) mais pas une application fonctionnant dans Tomcat.

cliff.meyers a déjà mentionné la manière que vous devriez plutôt utiliser pour votre application web. Il s'agit de la méthode standard, qui répond également à votre question sur le fait d'être configurable par le biais de context.xml ou server.xml.

Cela dit, si vous avez vraiment besoin de propriétés système ou d'autres options jvm (comme les paramètres de mémoire maximale) dans tomcat, vous devez créer un fichier nommé "bin/setenv.sh" ou "bin/setenv.bat". Ces fichiers n'existent pas dans l'archive standard que vous téléchargez, mais s'ils sont présents, leur contenu est exécuté au démarrage (si vous démarrez tomcat via startup.sh/startup.bat). C'est une bonne façon de séparer vos propres paramètres des paramètres standard de tomcat et cela rend les mises à jour beaucoup plus faciles. Pas besoin de modifier startup.sh ou catalina.sh.

(Si vous exécutez tomcat en tant que service Windows, vous utilisez généralement tomcat5w.exe, tomcat6w.exe etc. pour configurer les paramètres du registre pour le service).

EDIT : Une autre possibilité est d'opter pour Ressources JNDI .

8voto

gerrytan Points 10345

Une alternative à la définition de la propriété système sur la configuration de tomcat est d'utiliser la variable d'environnement CATALINA_OPTS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X