it-swarm.dev

Jak mohu specifikovat vlastnosti systému v konfiguraci Tomcat při spuštění?

Rozumím, že mohu zadat vlastnosti systému Tomcat předáním argumentů s parametrem -D, například " -Dmy.prop = value ".

Zajímalo by mě, jestli je to čistší způsob, jak to udělat, a to zadáním hodnot vlastností v souboru context.xml nebo nějakém jiném konfiguračním souboru Tomcat. Chtěl bych to udělat, protože nejprve je snazší sledovat své vlastnosti a za druhé mám několik kontextů a nevím, jak bych specifikoval kontextově specifické vlastnosti prostřednictvím parametru -D.

Používám verzi Tomcat 5.5.

73
Markus

(Aktualizace: Kdybych mohl tuto odpověď smazat, i když od té doby, co byla přijata, nemohu. Aktualizuji popis, abych poskytl lepší pokyny a odradil lidi od používání špatné praxe, kterou jsem popsal v původní odpovědi).

Tyto parametry můžete specifikovat pomocí parametrů kontextu nebo prostředí, například v kontextu context.xml. Viz sekce s názvem "Parametry kontextu" a "Záznamy o prostředí" na této stránce:

http://Tomcat.Apache.org/Tomcat-5.5-doc/config/context.html

Jak ukazuje @netjeff, tyto hodnoty budou dostupné prostřednictvím metody Context.lookup (String) a nikoli jako systémové parametry.

Dalším způsobem, jak tyto hodnoty zadat, je definovat proměnné uvnitř souboru web.xml webové aplikace, kterou nasazujete (viz níže). Jak upozorňuje @ Roberto Lo Giacco, toto je obecně považováno za špatnou praxi, protože rozvinutý artefakt by neměl být specifický pro životní prostředí. Níže je uveden úryvek konfigurace, pokud to opravdu chcete udělat:

<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

Původní odpověď cliff.meyers, která navrhla použití <env-entry>, nepomůže při použití pouze System.getProperty () 

Podle Tomcat 6.0 docs <env-entry> je pro JNDI . To znamená, že nebude mít žádný vliv na System.getProperty().

S <env-entry> z příkladu cliff.meyersje následující kód 

System.getProperty("SMTP_PASSWORD");

vrátí hodnotu null, nikoli hodnotu "abc123ftw".

Chcete-li použít <env-entry>, měli byste použít kód <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");

Upozornění: výše uvedený příklad jsem ještě nevyzkoušela. Ale já jsem vyzkoušel <env-entry> s System.getProperty (), a to rozhodně nefunguje.

28
netjeff

Je také možné nechat server ServletContextListener nastavit vlastnosti systému:

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) {
    }
}

A pak to vložte do vašeho web.xml (mělo by být možné i pro context.xml)

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

Fungovalo to pro mě.

13
basicEntity

Obecně byste neměli spoléhat na vlastnosti systému, abyste mohli konfigurovat webapp - mohou být použity ke konfiguraci kontejneru (např. Tomcat), ale nikoli aplikace spuštěné uvnitř Tomcatu.

cliff.meyers již zmínil způsob, jakým byste měli raději použít pro vaše webové aplikace. To je standardní způsob, který také vyhovuje vaší otázce konfigurovatelnosti prostředkem context.xml nebo server.xml.

To znamená, že pokud opravdu potřebujete vlastnosti systému nebo jiné možnosti jvm (jako je nastavení maximální paměti) v aplikaci Tomcat, měli byste vytvořit soubor s názvem „bin/setenv.sh“ nebo „bin/setenv.bat“. Tyto soubory neexistují ve standardním archivu, který si stáhnete, ale pokud jsou přítomny, je obsah spuštěn během spuštění (pokud spustíte Tomcat přes startup.sh/startup.bat). Toto je pěkný způsob, jak oddělit vlastní nastavení od standardních nastavení Tomcat a usnadňuje aktualizace. Není třeba Tweak startup.sh nebo catalina.sh.

(Pokud spustíte službu Tomcat jako službu Windows, obvykle používáte Tomcat5w.exe, Tomcat6w.exe atd. Ke konfiguraci nastavení registru pro službu.)

EDIT: Další možností je jít na JNDI Resources

13
Olaf Kock

Alternativou k nastavení vlastnosti systému v konfiguraci Tomcat je použití proměnné prostředí CATALINA_OPTS

7
gerrytan

Tato otázka je řešena ve wiki Apache.

Otázka: Mohu nastavit vlastnosti systému Java odlišně pro každý webapp?

Odpověď: Ne. Pokud můžete upravovat spouštěcí skripty Tomcatu (nebo lépe vytvořit soubor setenv.sh), můžete do jazyka Java přidat možnosti „-D“. V Javě však neexistuje žádný způsob, jak mít různé hodnoty vlastností systému pro různé třídy ve stejném JVM. K dispozici jsou některé další metody, jako je například použití ServletContext.getContextPath () pro získání kontextového názvu vaší webové aplikace a nalezení odpovídajících zdrojů, nebo definování prvků ve WEB-INF/web.xml souboru vaší webové aplikace a pak nastavení hodnoty v kontextovém souboru Tomcat (META-INF/context.xml). Viz 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

Do souboru catalina.properties v adresáři <Tomcat installation directory>/conf můžete přidat potřebné vlastnosti.

Odkaz: https://Tomcat.Apache.org/Tomcat-8.0-doc/config/index.html

Všechny systémové vlastnosti jsou dostupné včetně těch, které jsou nastaveny pomocí syntaxe -D , Těch, které jsou automaticky zpřístupněny JVM, a těch, které jsou konfigurovány v souboru $ CATALINA_BASE/conf/catalina.properties.

1
zendu

Pokud chcete definovat proměnnou prostředí ve vaší kontextové bázi na dokumentaci, kterou jste zadali, definujte je níže 

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

Použijte je také níže: 

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

Měli byste dostat 10 jako výstup.

0
Alireza Alallah