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

Je comprends que je peux spécifier des propriétés système à Tomcat en transmettant des arguments avec le paramètre -D, par exemple ” -Dmy.prop = value “.

Je me demande s’il existe une méthode plus propre en spécifiant les valeurs de propriété dans le fichier context.xml ou un autre fichier de configuration tomcat. J’aimerais faire cela car, 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 des propriétés spécifiques au contexte via le paramètre -D.

J’utilise Tomcat version 5.5.

(Mise à jour: Si je pouvais supprimer cette réponse, je le ferais, même si, depuis qu’elle a été acceptée, je ne peux pas. Je mets à jour la description pour mieux orienter et décourager les

Vous pouvez spécifier ces parameters via des parameters de contexte ou d’environnement, tels que context.xml. Voir 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 @netjeff le souligne, ces valeurs seront disponibles via la méthode Context.lookup (Ssortingng) et non en tant que parameters du 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 le souligne @Roberto Lo Giacco, ceci est généralement considéré comme une mauvaise pratique car un artefact déployé ne doit pas être spécifique à l’environnement. Cependant, voici l’extrait de configuration si vous voulez vraiment faire ceci:

 SMTP_PASSWORD java.lang.Ssortingng abc123ftw  

La réponse initiale de cliff.meyers suggérant d’utiliser ne sera d’aucune aide si vous n’utilisez que System.getProperty ()

Selon les documents Tomcat 6.0, est destiné à JNDI . Cela signifie que cela n’aura aucun effet sur System.getProperty() .

Avec l’exemple de cliff.meyers , le code suivant

 System.getProperty("SMTP_PASSWORD"); 

renverra null, pas la valeur “abc123ftw”.

Selon les documents Tomcat 6, pour utiliser vous devez écrire un code comme celui-ci pour utiliser :

 // Obtain our environment naming context Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); // Look up our data source Ssortingng s = (Ssortingng)envCtx.lookup("SMTP_PASSWORD"); 

Mise en garde: Je n’ai pas vraiment essayé l’exemple ci-dessus. Mais j’ai essayé avec System.getProperty (), et cela ne fonctionne absolument pas.

En général, vous ne devriez pas vous fier aux 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 pour une application exécutée à l’intérieur de tomcat.

Cliff.meyers a déjà mentionné la manière dont vous devriez plutôt utiliser pour votre application Web. C’est la méthode standard, qui correspond également à votre question d’être configurable par le biais des moyens context.xml ou server.xml.

Cela dit, si vous avez vraiment besoin des propriétés du système ou d’autres options de jvm (comme les parameters de mémoire max) dans tomcat, vous devriez 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 parameters des parameters standard de tomcat et de simplifier les mises à jour. 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 parameters du registre pour le service.)

EDIT: Aussi, une autre possibilité est d’aller pour les ressources JNDI .

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 params = context.getInitParameterNames(); while (params.hasMoreElements()) { Ssortingng param = (Ssortingng) params.nextElement(); Ssortingng 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 (devrait être possible pour context.xml aussi)

  customPrefix.property value java.lang.Ssortingng   servletUtils.SystemPropertiesHelper  

Cela a fonctionné pour moi.

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

Cette question est adressé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 éditer les scripts de démarrage de Tomcat (ou mieux créer un fichier setenv.sh), vous pouvez append des options “-D” à Java. Mais il n’ya aucun moyen en Java d’avoir des valeurs de propriétés système différentes pour différentes classes de 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 paramètre. les valeurs correspondantes 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

Vous pouvez append les propriétés nécessaires au fichier catalina.properties dans le répertoire /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 celles définies à l’aide de la syntaxe -D, celles mises à disposition automatiquement par la machine virtuelle Java et celles configurées dans le fichier $ CATALINA_BASE / conf / catalina.properties.

Si vous souhaitez définir une variable d’environnement dans votre base de contexte sur la documentation, vous devez les définir comme ci-dessous.

  ...  ...  

Utilisez-les aussi comme ci-dessous:

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

Vous devriez obtenir 10 comme sortie.