web-dev-qa-db-fra.com

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 système à Tomcat en passant des arguments avec le paramètre -D, par exemple " -Dmy.prop = valeur ".

Je me demande s’il existe une méthode plus simple pour le faire en spécifiant les valeurs de propriété dans le fichier context.xml ou dans un autre fichier de configuration Tomcat. J'aimerais faire cela parce que, premièrement, il est plus facile de garder une trace de mes propriétés, et deuxièmement, plusieurs contextes sont en cours d'exécution et je ne sais pas comment spécifier des propriétés spécifiques au contexte via le paramètre -D.

J'utilise Tomcat version 5.5.

73
Markus

(Mise à jour: si je pouvais supprimer cette réponse, je le ferais, bien que cette proposition étant acceptée, je ne peux pas. Je mets à jour la description pour mieux guider 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, tels que in context.xml. Voir les sections "Paramètres de contexte" et "Entrées d'environnement" sur cette page:

http://Tomcat.Apache.org/Tomcat-5.5-doc/config/context.html

Comme @netjeff le fait remarquer, ces valeurs seront disponibles via la méthode Context.lookup (String) et non sous forme de paramètres système.

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

<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>
13
cliff.meyers

La réponse originale de cliff.meyers suggérant d'utiliser <env-entry> n'aidera pas si vous utilisez uniquement System.getProperty () 

Selon Tomcat 6.0 docs <env-entry> est destiné à JNDI . Cela signifie donc que cela n'aura aucun effet sur System.getProperty().

Avec l’exemple <env-entry> from cliff.meyers _, le code suivant 

System.getProperty("SMTP_PASSWORD");

retournera null, pas la valeur "abc123ftw".

Selon les documents Tomcat 6, pour utiliser <env-entry>, vous devez écrire un code comme celui-ci pour utiliser <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 j ai essayé <env-entry> avec System.getProperty (), et cela ne fonctionne vraiment pas.

28
netjeff

Il est également possible de laisser un ServletContextListener définir les propriétés 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 mettez ceci dans votre web.xml (cela devrait être possible aussi pour context.xml)

<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>

Cela a fonctionné pour moi.

13
basicEntity

En règle générale, vous ne devez pas vous fier aux propriétés système pour configurer une application Web. Elles peuvent être utilisées pour configurer le conteneur (par exemple, Tomcat), mais pas pour une application s'exécutant dans Tomcat.

cliff.meyers a déjà mentionné la manière dont vous devriez utiliser plutôt pour votre application Web. C’est la méthode standard, qui répond également à votre question de pouvoir être configurée à l’aide des méthodes context.xml ou server.xml.

Cela dit, si vous avez vraiment besoin de propriétés système ou d'autres options JVM (telles que 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, le contenu est exécuté au démarrage (si vous démarrez Tomcat via startup.sh/startup.bat). C’est un bon moyen de séparer vos propres paramètres des paramètres standard de Tomcat, ce qui facilite grandement les mises à jour. Pas besoin de Tweak 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 de registre du service.)

EDIT: En outre, une autre possibilité consiste à choisir Ressources JNDI

13
Olaf Kock

Une alternative à la définition de la propriété système dans la configuration de Tomcat consiste à utiliser la variable d’environnement CATALINA_OPTS.

7
gerrytan

Cette question est abordée dans le wiki Apache.

Question: "Puis-je définir les propriétés du système Java différemment pour chaque application Web?"

Réponse: Non. Si vous pouvez modifier les scripts de démarrage de Tomcat (ou créer un fichier setenv.sh), vous pouvez ajouter les options "-D" à Java. Cependant, il n’ya aucun moyen en Java d’avoir des valeurs différentes de propriétés système pour différentes classes dans la même machine virtuelle. Il existe d'autres méthodes disponibles, telles que l'utilisation de ServletContext.getContextPath () pour obtenir le nom de contexte de votre application Web et localiser certaines ressources en conséquence, ou pour définir des éléments dans le fichier WEB-INF/web.xml de votre application Web, puis définir le paramètre. leurs valeurs dans le fichier de contexte Tomcat (META-INF/context.xml). Voir http://Tomcat.Apache.org/Tomcat-7.0-doc/config/context.html

http://wiki.Apache.org/Tomcat/HowTo#Can_I_set_Java_system_properties_differently_for_each_webapp.3F

6
user64141

Vous pouvez ajouter les propriétés nécessaires au fichier catalina.properties dans le répertoire <Tomcat installation directory>/conf.

Référence: https://Tomcat.Apache.org/Tomcat-8.0-doc/config/index.html

Toutes les propriétés système sont disponibles, y compris celles définies à l'aide de l'option -D syntaxe, celles automatiquement mises à disposition par la JVM et celles configuré dans le fichier $ CATALINA_BASE/conf/catalina.properties.

1
zendu

Si vous souhaitez définir une variable d'environnement dans votre base de contexte sur la documentation, vous devez les définir comme suit. 

<Context ...>
  ...
  <Environment name="maxExemptions" value="10"
         type="Java.lang.Integer" override="false"/>
  ...
</Context>

Également les utiliser comme ci-dessous: 

((Context)new InitialContext().lookup("Java:comp/env")).lookup("maxExemptions")

Vous devriez obtenir 10 en sortie.

0
Alireza Alallah