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

74

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.

Markus
quelle
11
Fügen Sie "property = value" als reinen Text an Catalina.properties an. (unter Linux ist es in / etc /
tomcat

Antworten:

13

(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>
cliff.meyers
quelle
Ich konnte meine web.xml nicht dazu bringen, mit den oben genannten Informationen zu validieren. Das Ändern der Reihenfolge der Einträge vom Typ env-entry-value und env-entry-type hat jedoch funktioniert.
Catchwa
Okay, die DTD oder XSD gibt wahrscheinlich eine genaue Reihenfolge für diese Elemente an. Ich habe meine Antwort entsprechend aktualisiert. Vielen Dank.
Cliff.meyers
2
Zu Ihrer Information, wie in meiner Antwort unten angegeben, werden die <env-entry> -Werte nicht in System.getProperty () angezeigt.
Netjeff
1
Wenden Sie diesen Rat NICHT auf die Datei web.xml an: Ihr Deployable ist umgebungsspezifisch und als solches erkennen Sie ein Anti-Pattern. Kontext- und Umgebungsparameter sind ein guter Ort für diese Einstellungen.
Roberto Lo Giacco
Dies ist großartig, wenn Sie hartcodierte Dinge mögen, die sich in jeder Umgebung ändern, wie z. B. Ihr Protokollierungsverzeichnis. ;-) Es beantwortet auch nicht die Frage, wie sie gestellt wurde.
user447607
29

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 hat System.getProperty().

Mit dem Beispiel <env-entry>von cliff.meyers den folgenden Code

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

netjeff
quelle
2
Als er nach einer saubereren Vorgehensweise fragte, interpretierte ich dies als Vorschlag, auch keine Systemeigenschaften zu verwenden. Ich hatte nicht vor, mit meiner Antwort zu arbeiten: System.getProperty ("SMTP_PASSWORD")
cliff.meyers
1
Ja, ich sehe jetzt, was Sie angestrebt haben. In diesem Fall "verdeutlicht" meine Antwort, dass Markus, wenn er <env-entry> in context.xml verwenden würde, die etwas kompliziertere Kontext-API (wie in meinem Beispiel) anstelle des Einzeilensystems verwenden müsste .getProperty (). Ich hoffe, Markus hat etwas gefunden, das für seine Bedürfnisse funktioniert hat.
Netjeff
13

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 .

Olaf Kock
quelle
13

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.

basicEntity
quelle
8

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

Gerrytan
quelle
6

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

user64141
quelle
4

Sie können der catalina.propertiesDatei im <tomcat installation directory>/confVerzeichnis 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 der -D-Syntax festgelegten, der automatisch von der JVM bereitgestellten und der in der Datei $ CATALINA_BASE / conf / catalogina.properties konfigurierten.

zendu
quelle
0

Wenn Sie eine Umgebungsvariable in Ihrem Kontext basierend auf der Dokumentation definieren möchten, sollten Sie sie wie folgt definieren

<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 10als Ausgabe erhalten.

Alireza Alallah
quelle