webentwicklung-frage-antwort-db.com.de

Wie kann ich beim Starten die Systemeigenschaften in der Tomcat-Konfiguration angeben?

Ich verstehe, dass ich Systemeigenschaften für Tomcat angeben kann, indem Sie Argumente mit dem Parameter -D übergeben, beispielsweise " -Dmy.prop = value ".

Ich frage mich, ob dies auf sauberere Weise möglich ist, indem Sie die Eigenschaftswerte in der Datei context.xml oder in einer anderen Tomcat-Konfigurationsdatei angeben. Ich möchte dies gerne tun, weil es erstens einfacher ist, meine Eigenschaften zu verfolgen, und zweitens laufen mehrere Kontexte und ich weiß nicht, wie ich kontextspezifische Eigenschaften über den Parameter -D angeben würde.

Ich verwende Tomcat Version 5.5.

73
Markus

(Update: Wenn ich diese Antwort löschen könnte, würde ich dies tun, auch wenn sie akzeptiert wurde, kann ich das nicht. Ich aktualisiere die Beschreibung, um eine bessere Anleitung zu geben und die Leute davon abzuhalten, die schlechte Praxis anzuwenden, die ich in der ursprünglichen Antwort beschrieben habe).

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 verfügbar und nicht als Systemparameter.

Sie können diese Werte auch festlegen, indem Sie Variablen in der Datei web.xml der Webanwendung definieren, die Sie bereitstellen (siehe unten). Wie @Roberto Lo Giacco hervorhebt, wird dies im Allgemeinen als schlechte Praxis betrachtet, da ein eingesetztes Artefakt nicht umweltspezifisch sein sollte. Nachfolgend 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>
13
cliff.meyers

Die ursprüngliche Antwort von cliff.meyers, die die Verwendung von <env-entry> vorschlug, hilft nicht, wenn nur System.getProperty () verwendet wird. 

Laut Tomcat 6.0 ist docs <env-entry> für JNDI . Das bedeutet, dass es keine Auswirkungen auf System.getProperty() hat.

Mit dem Code <env-entry> from cliff.meyers der folgende Code 

System.getProperty("SMTP_PASSWORD");

gibt null zurück, nicht den Wert "abc123ftw".

Gemäß den Tomcat-6-Dokumenten müssen Sie zur Verwendung von <env-entry> Code wie folgt schreiben, um <env-entry> zu verwenden:

// 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");

Vorbehalt: Ich habe das Beispiel oben eigentlich nicht ausprobiert. Aber ich habe habe mit System.getProperty () <env-entry> ausprobiert, und das funktioniert definitiv nicht.

28
netjeff

Es ist auch möglich, einen ServletContextListener die Systemeigenschaften festlegen zu lassen:

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 das 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 für mich funktioniert.

13
basicEntity

Im Allgemeinen sollten Sie sich bei der Konfiguration einer Webanwendung nicht auf die 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 Ihre Webapplikation verwenden sollten. Dies ist die Standardmethode, die auch für Ihre Frage geeignet ist, über die Funktionen context.xml oder server.xml konfigurierbar zu sein.

Sollten Sie in Tomcat wirklich Systemeigenschaften oder andere jvm-Optionen (wie die maximalen Speichereinstellungen) benötigen, sollten Sie eine Datei mit dem Namen "bin/setenv.sh" oder "bin/setenv.bat" erstellen. Diese Dateien sind nicht im Standardarchiv vorhanden, das Sie herunterladen. Wenn sie jedoch vorhanden sind, wird der Inhalt während des Startvorgangs ausgeführt (wenn Sie Tomcat über startup.sh/startup.bat starten). Dies ist eine gute Möglichkeit, Ihre eigenen Einstellungen von den Standardeinstellungen von Tomcat zu trennen, und macht Updates so viel einfacher. Keine Notwendigkeit, startup.sh oder catalina.sh zu optimieren.

(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.)

BEARBEITEN: Eine weitere Möglichkeit besteht in JNDI Resources

13
Olaf Kock

Eine Alternative zum Festlegen der Systemeigenschaft in der Tomcat-Konfiguration ist die Verwendung der Umgebungsvariable CATALINA_OPTS

7
gerrytan

Diese Frage wird im Apache-Wiki behandelt.

Frage: "Kann ich die Java-Systemeigenschaften für jede Webanwendung anders einstellen?"

Antwort: Nein. Wenn Sie die Startskripts von Tomcat bearbeiten können (oder besser eine setenv.sh-Datei erstellen), können Sie Java -D-Optionen hinzufügen. In Java gibt es jedoch keine Möglichkeit, unterschiedliche Werte der Systemeigenschaften für verschiedene Klassen in derselben JVM zu verwenden. Es gibt einige andere Methoden, z. B. die Verwendung von ServletContext.getContextPath (), um den Kontextnamen Ihrer Webanwendung abzurufen und einige Ressourcen entsprechend zu suchen oder um Elemente in der WEB-INF/web.xml-Datei Ihrer Webanwendung zu definieren und die Einstellung vorzunehmen 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

6
user64141

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

Alle Systemeigenschaften sind verfügbar, einschließlich der mit -D .__ festgelegten. Syntax, die von der JVM automatisch zur Verfügung gestellten und die in der Datei $ CATALINA_BASE/conf/catalina.properties konfiguriert.

1
zendu

Wenn Sie eine Umgebungsvariable in Ihrer kontextbasierten Dokumentation definieren möchten, definieren Sie sie wie folgt 

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

Verwenden Sie sie auch wie folgt: 

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

Sie sollten 10 als Ausgabe erhalten.

0
Alireza Alallah