2008-12-16 10 views
71

Je comprends que je peux spécifier des propriétés système à Tomcat en passant des arguments avec le paramètre -D, par exemple "-Dmy.prop = valeur".Comment puis-je spécifier les propriétés du système dans la configuration de Tomcat au démarrage?

Je me demande s'il existe une façon plus simple de le faire en spécifiant les valeurs de propriété dans le fichier context.xml ou dans un autre fichier de configuration de tomcat. Je voudrais le faire parce que, premièrement, il est plus facile de garder une trace de mes propriétés, et deuxièmement, j'ai plusieurs contextes en cours d'exécution et je ne sais pas comment spécifier les propriétés spécifiques au contexte via le paramètre -D. J'utilise Tomcat version 5.5.

+10

ajoutez "propriété = valeur" comme texte pur à catalina.properties. (en linux c'est dans/etc/tomcat) – VasyaNovikov

Répondre

13

(Si je pouvais supprimer cette réponse, je le ferais, bien que je l'accepte, je ne peux pas.) Je suis en train de mettre à jour la description pour mieux guider et décourager les gens d'utiliser la mauvaise pratique).

Vous pouvez spécifier ces paramètres via des paramètres de contexte ou d'environnement, tels que context.xml. Voir les sections intitulées « Paramètres de contexte » et « environnement » Entrées sur cette page:

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

Comme @netjeff souligne, ces valeurs seront disponibles via la méthode context.lookup (String) et non en tant que système paramètres.

Une autre façon de spécifier ces valeurs consiste à définir des variables dans le fichier web.xml de l'application Web que vous déployez (voir ci-dessous). Comme le fait remarquer @Roberto Lo Giacco, ceci est généralement considéré comme une mauvaise pratique étant donné qu'un artefact déployé ne doit pas être spécifique à l'environnement. Cependant, au-dessous est 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> 
+0

Je n'ai pas pu obtenir mon web.xml pour valider en utilisant ce qui précède. Changer l'ordre des entrées env-entry-value et env-entry-type a fonctionné, cependant. – Catchwa

+0

D'accord, la DTD ou XSD spécifie probablement un ordre précis pour ces éléments. J'ai mis à jour ma réponse en conséquence. Merci. –

+2

FYI, comme indiqué dans ma réponse ci-dessous, les valeurs n'apparaîtront pas dans System.getProperty(). – netjeff

12

En général, vous ne devez pas compter sur les propriétés du système pour configurer une webapp - ils peuvent être utilisés pour configurer le conteneur (par exemple Tomcat), mais pas une application s'exécutant à l'intérieur de Tomcat. Cliff.meyers a déjà mentionné la façon dont vous devriez plutôt l'utiliser pour votre application Web. C'est la manière standard, cela correspond également à votre question d'être configurable via context.xml ou server.xml signifie. 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 max) 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 lancez tomcat via startup.sh/startup.bat). C'est un bon moyen de séparer vos propres paramètres des paramètres standard de Tomcat et de faciliter les mises à jour. Pas besoin de taper startup.sh ou catalina.sh.

(. Si vous exécutez tomcat que Windows servive, vous utilisez habituellement tomcat5w.exe, etc. tomcat6w.exe pour configurer les paramètres de registre pour le service)

EDIT: En outre, une autre possibilité est d'aller pour JNDI Resources .

27

cliff.meyers réponse originale d » qui a suggéré d'utiliser <env-entry> ne sera pas utile lors de l'utilisation que System.getProperty()

Selon le Tomcat 6.0 docs <env-entry> is for JNDI. Cela signifie donc que cela n'aura aucun effet sur System.getProperty().

Avec les <env-entry> de cliff.meyers de par exemple de », le code suivant

System.getProperty("SMTP_PASSWORD"); 

retournera nulle et non la valeur "abc123ftw".

Selon le Tomcat 6 docs, d'utiliser <env-entry> que vous auriez à écrire du code comme celui-ci à 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"); 

caveat: Je ne l'ai pas vraiment essayé l'exemple ci-dessus. Mais je ai essayé <env-entry> avec System.getProperty(), et cela ne fonctionne définitivement pas.

+2

Quand il a demandé une façon plus simple de le faire, j'ai interprété cela comme signifiant des suggestions pour ne pas utiliser les propriétés du système aussi. Je n'avais pas l'intention ma réponse de travailler avec: System.getProperty ("SMTP_PASSWORD") –

+1

Oui, je vois maintenant ce que vous visiez. Dans ce cas, ma réponse "clarifie" que si Markus utilisait dans context.xml, alors il devrait utiliser l'API Context légèrement plus compliquée (comme dans mon exemple), plutôt que one-liner System.getProperty() . J'espère que Markus a trouvé quelque chose qui a fonctionné pour ses besoins. – netjeff

12

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 puis mettre cela dans votre web.xml (devrait être possible pour context.xml trop)

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

Il a travaillé pour moi.

7

Une alternative à la définition de la propriété du système sur la configuration tomcat consiste à utiliser des variables d'environnement CATALINA_OPTS

5

Cette question est abordée dans le wiki Apache. Question: "Puis-je définir différemment les propriétés du système Java pour chaque application Web?" Réponse: Non. Si vous pouvez éditer les scripts de démarrage de Tomcat (ou mieux créer un fichier setenv.sh), vous pouvez ajouter des options "-D" à Java. Mais il n'y a aucun moyen en Java d'avoir différentes valeurs de propriétés système pour différentes classes dans la même JVM. Il existe d'autres méthodes disponibles, comme 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 valeurs pour eux 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

0

Vous pouvez ajouter des propriétés nécessaires pour le fichier dans le répertoire catalina.properties<tomcat installation directory>/conf.

Référence: https://tomcat.apache.org/tomcat-8.0-doc/config/index.html

Toutes les propriétés du système sont disponibles, y compris ceux définis à l'aide de la -D syntaxe, ceux automatiquement mis à disposition par la machine virtuelle Java et les configurés dans le CATALINA_BASE $/conf/catalina.properties .

Questions connexes