2008-12-16 3 views
71

Ich verstehe, dass ich Systemeigenschaften zu Tomcat angeben kann, indem Sie Argumente mit dem Parameter -D übergeben, zum Beispiel "-Dmy.prop = Wert".Wie kann ich beim Start Systemeigenschaften in der Tomcat-Konfiguration angeben?

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 würde dies gerne tun, weil es erstens einfacher ist, meine Eigenschaften zu verfolgen, und zweitens, dass 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.

+10

"Eigenschaft = Wert" als reinen Text an catalina.properties anhängen. (in linux ist es in/etc/tomcat) – VasyaNovikov

Antwort

13

(Update: Wenn ich diese Antwort löschen könnte, würde ich, obwohl es akzeptiert wird, kann ich nicht. Ich aktualisiere die Beschreibung, um bessere Anleitung zu bieten und Leute davon abzuhalten, die schlechte Praxis zu verwenden, die ich in der ursprünglichen Antwort umrissen habe).

Sie können diese Parameter über Kontext- oder Umgebungsparameter angeben, z. B. in context.xml. Siehe die Abschnitte „Context-Parameter“ betitelt und „Umwelt-Einträge“ auf dieser Seite:

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

Wie @netjeff weist darauf hin, werden diese Werte über die context.lookup (String) -Methode und nicht als System verfügbar sein Parameter.

Eine andere Möglichkeit, diese Werte anzugeben, besteht darin, Variablen innerhalb der Datei web.xml der Webanwendung zu definieren, die Sie bereitstellen (siehe unten). Wie @Roberto Lo Giacco hervorhebt, wird dies allgemein als eine schlechte Praxis angesehen, da ein bereitgestelltes Artefakt nicht umgebungsspezifisch sein sollte. Allerdings unten ist die Konfiguration Schnipsel, wenn Sie das 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> 
+0

Ich konnte nicht meine web.xml zur Validierung mit dem oben genannten erhalten. Die Reihenfolge der Env-Entry-Value- und Env-Entry-Type-Einträge wurde jedoch geändert. – Catchwa

+0

Okay, die DTD oder XSD gibt wahrscheinlich eine genaue Reihenfolge für diese Elemente an. Ich habe meine Antwort entsprechend aktualisiert. Vielen Dank. –

+2

FYI, wie in meiner Antwort unten erwähnt, die Werte werden nicht in System.getProperty() angezeigt. – netjeff

12

Generell sollten Sie nicht auf Systemeigenschaften verlassen, um eine Webapp zu konfigurieren - sie verwendet werden können, um den Behälter (zB Tomcat), aber nicht konfigurieren eine Anwendung, die in Tomcat ausgeführt wird.

cliff.meyers hat bereits erwähnt, wie Sie lieber für Ihre Webapplikation verwenden sollten. Das ist der Standardweg, der auch zu Ihrer Frage passt, ob Sie über context.xml oder server.xml konfigurierbar sind.

Das heißt, sollten Sie 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 existieren nicht in dem Standardarchiv, das Sie herunterladen, aber wenn sie vorhanden sind, wird der Inhalt während des Startvorgangs ausgeführt (wenn Sie Tomcat über startup.sh/startup.bat starten). Dies ist eine nette Möglichkeit, um Ihre eigenen Einstellungen von den Standard-Tomcat-Einstellungen zu trennen und Updates so viel einfacher zu machen. Keine Notwendigkeit, startup.sh oder catalina.sh zu optimieren.

(. Wenn Sie tomcat als Fenster servive ausführen, können Sie in der Regel verwenden tomcat5w.exe, tomcat6w.exe etc., um die Registrierungseinstellungen für den Dienst konfigurieren)

EDIT: Auch, ist eine weitere Möglichkeit für JNDI Resources gehen .

27

cliff.meyers ‚s ursprüngliche Antwort, die <env-entry> vorgeschlagene Verwendung wird nicht helfen, wenn nur System.getProperty mit()

den <env-entry> is for JNDI 6.0 docs Tomcat Laut. Das bedeutet, dass es keine Auswirkungen auf System.getProperty() hat.

Mit dem <env-entry> von cliff.meyers ‚s Beispiel des folgenden Code

System.getProperty("SMTP_PASSWORD"); 

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

Nach den Tomcat 6 docs, <env-entry> verwenden Sie Code wie diesen schreiben müsste <env-entry> 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"); 

Caveat: Ich habe nicht wirklich das obige Beispiel versucht. Aber ich habe versucht <env-entry> mit System.getProperty(), und das funktioniert definitiv nicht.

+2

Als er nach einem saubereren Weg fragte, interpretierte ich das als Vorschläge, die Systemeigenschaften nicht zu verwenden. Ich hatte nicht die Absicht, mit meiner Antwort zu arbeiten: System.getProperty ("SMTP_PASSWORD") –

+1

Ja, ich sehe jetzt, was Sie anstrebten. In diesem Fall "klärt" meine Antwort, dass, wenn Markus in context.xml verwenden würde, er die etwas kompliziertere Context-API (wie in meinem Beispiel) verwenden müsste, anstatt ein Einzeiler System.getProperty() . Ich hoffe Markus hat etwas gefunden, das für seine Bedürfnisse funktioniert hat. – netjeff

12

Es ist auch möglich, lassen ein ServletContextListener die Systemeigenschaften festgelegt:

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 diese dann in Ihre web.xml setzen (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 funktionierte für mich.

7

Eine Alternative, um die Systemeigenschaft auf tomcat Konfiguration Einstellung ist CATALINA_OPTS Umgebungsvariable

5

Diese Frage im Wiki Apache gerichtet zu verwenden.

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

Antwort: Nein. Wenn Sie die Startskripte 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 Systemeigenschaften für verschiedene Klassen in derselben JVM zu verwenden. Es gibt einige andere Methoden, wie ServletContext.getContextPath() zu verwenden, 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 anschließend die Werte für sie in 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

0

Sie könnten notwendige Eigenschaften in <tomcat installation directory>/conf Verzeichnis catalina.properties Datei hinzufügen.

Referenz: https://tomcat.apache.org/tomcat-8.0-doc/config/index.html

Alle Systemeigenschaften zur Verfügung, einschließlich denen, die -D Syntax, die automatisch zur Verfügung gestellt von der JVM und derjenigediejenigedasjenige im $ CATALINA_BASE/conf/catalina.properties Datei konfigurierte .

Verwandte Themen