Ich verstehe, dass ich Tomcat Systemeigenschaften angeben kann, indem ich Argumente mit dem Parameter -D übergebe, zum Beispiel " -Dmy.prop = value ".
Ich frage mich, ob es eine sauberere Möglichkeit gibt, dies zu tun, indem Sie die Eigenschaftswerte in der Datei context.xml oder einer anderen Tomcat-Konfigurationsdatei angeben. Ich möchte dies tun, weil es erstens einfacher ist, meine Eigenschaften zu verfolgen, und zweitens mehrere Kontexte ausgeführt werden und ich nicht weiß, wie ich kontextspezifische Eigenschaften über den Parameter -D angeben würde.
Ich verwende Tomcat Version 5.5.
Antworten:
(Update: Wenn ich diese Antwort löschen könnte, würde ich dies tun, obwohl ich es nicht kann. Ich aktualisiere die Beschreibung, um eine bessere Anleitung zu bieten und die Leute davon abzuhalten, die in der ursprünglichen Antwort skizzierte schlechte Praxis anzuwenden.)
Sie können diese Parameter über Kontext- oder Umgebungsparameter angeben, z. B. in context.xml. Siehe die Abschnitte "Kontextparameter" und "Umgebungseinträge" auf dieser Seite:
http://tomcat.apache.org/tomcat-5.5-doc/config/context.html
Wie @netjeff hervorhebt, sind diese Werte über die Context.lookup (String) -Methode und nicht als Systemparameter verfügbar.
Eine andere Möglichkeit, diese Werte anzugeben, besteht darin, Variablen in der Datei web.xml der Webanwendung zu definieren, die Sie bereitstellen (siehe unten). Wie @Roberto Lo Giacco hervorhebt, wird dies im Allgemeinen als schlechte Praxis angesehen, da ein bereitgestelltes Artefakt nicht umgebungsspezifisch sein sollte. Im Folgenden finden Sie jedoch das Konfigurations-Snippet, wenn Sie dies wirklich tun möchten:
<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>
quelle
Die ursprüngliche Antwort von cliff.meyers , die die Verwendung vorgeschlagen hat,
<env-entry>
hilft nicht, wenn nur System.getProperty () verwendet wird.Laut Tomcat 6.0 ist docs
<env-entry>
für JNDI . Das bedeutet also, dass es keine Auswirkungen auf hatSystem.getProperty()
.Mit dem Beispiel
<env-entry>
von cliff.meyers den folgenden CodeSystem.getProperty("SMTP_PASSWORD");
gibt null zurück, nicht den Wert "abc123ftw".
Laut den Tomcat 6-Dokumenten müssten Sie zur Verwendung
<env-entry>
folgenden Code schreiben<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");
Vorsichtsmaßnahme: Ich habe das obige Beispiel noch nicht ausprobiert. Aber ich habe es
<env-entry>
mit System.getProperty () versucht , und das funktioniert definitiv nicht.quelle
Im Allgemeinen sollten Sie sich beim Konfigurieren einer Webanwendung nicht auf Systemeigenschaften verlassen. Sie können zum Konfigurieren des Containers verwendet werden (z. B. Tomcat), jedoch nicht für eine Anwendung, die in Tomcat ausgeführt wird.
cliff.meyers hat bereits erwähnt, wie Sie es lieber für Ihre Webanwendung verwenden sollten. Dies ist die Standardmethode, die auch zu Ihrer Frage passt, ob Sie mit context.xml oder server.xml konfiguriert werden können.
Sollten Sie jedoch wirklich Systemeigenschaften oder andere JVM-Optionen (wie maximale Speichereinstellungen) in Tomcat benötigen, sollten Sie eine Datei mit dem Namen "bin / setenv.sh" oder "bin / setenv.bat" erstellen. Diese Dateien sind in dem von Ihnen heruntergeladenen Standardarchiv nicht vorhanden. Wenn sie jedoch vorhanden sind, wird der Inhalt beim Start ausgeführt (wenn Sie tomcat über startup.sh/startup.bat starten). Dies ist eine gute Möglichkeit, Ihre eigenen Einstellungen von den Standardeinstellungen für Tomcat zu trennen, und macht Updates so viel einfacher. Startup.sh oder Catalina.sh müssen nicht optimiert werden.
(Wenn Sie Tomcat als Windows-Dienst ausführen, verwenden Sie normalerweise tomcat5w.exe, tomcat6w.exe usw., um die Registrierungseinstellungen für den Dienst zu konfigurieren.)
EDIT: Eine andere Möglichkeit ist JNDI Resources .
quelle
Es ist auch möglich, dass ein ServletContextListener die Systemeigenschaften festlegt:
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) { } }
Und dann füge dies in deine web.xml ein (sollte auch für context.xml möglich sein)
<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>
Es hat bei mir funktioniert.
quelle
Eine Alternative zum Festlegen der Systemeigenschaft in der Tomcat-Konfiguration ist die Verwendung der Umgebungsvariablen CATALINA_OPTS
quelle
Diese Frage wird im Apache-Wiki behandelt.
Frage: "Kann ich die Java-Systemeigenschaften für jede Webanwendung unterschiedlich festlegen?"
Antwort: Nein. Wenn Sie die Startskripte von Tomcat bearbeiten können (oder besser eine setenv.sh-Datei erstellen können), können Sie Java "-D" -Optionen hinzufügen. In Java gibt es jedoch keine Möglichkeit, unterschiedliche Werte von Systemeigenschaften für unterschiedliche Klassen in derselben JVM zu haben. Es stehen einige andere Methoden zur Verfügung, z. B. die Verwendung von ServletContext.getContextPath (), um den Kontextnamen Ihrer Webanwendung abzurufen und einige Ressourcen entsprechend zu suchen, oder um Elemente in der Datei WEB-INF / web.xml Ihrer Webanwendung zu definieren und dann die festzulegen Werte für sie in der Tomcat-Kontextdatei (META-INF / context.xml). Siehe 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
quelle
Sie können der
catalina.properties
Datei im<tomcat installation directory>/conf
Verzeichnis die erforderlichen Eigenschaften hinzufügen .Referenz: https://tomcat.apache.org/tomcat-8.0-doc/config/index.html
quelle
Wenn Sie eine Umgebungsvariable in Ihrem Kontext basierend auf der Dokumentation definieren möchten, sollten Sie sie wie folgt definieren
Verwenden Sie sie auch wie folgt:
Sie sollten
10
als Ausgabe erhalten.quelle