GNU/Linux >> Znalost Linux >  >> Linux

Externalizace konfigurace webové aplikace Tomcat ze souboru .war

Líbí se mi .properties soubory místo

  • JNDI – proč vytvářet složitý objekt během konfigurace programu místo času inicializace?
  • vlastnosti systému – v jednom Tomcatu nemůžete samostatně konfigurovat několik instancí stejné WAR
  • kontextové parametry – jsou dostupné pouze v javax.servlet.Filter , javax.servlet.ServletContextListener což mi bude nepohodlné

Tomcat 7 Kontextový prvek Loader. Podle deskriptoru nasazení dokumentů (co v <Context> tag) lze umístit do:

  • $CATALINA_BASE/conf/server.xml - bad - vyžadovat restartování serveru, aby bylo možné znovu přečíst konfiguraci
  • $CATALINA_BASE/conf/context.xml - špatné - sdílené ve všech aplikacích
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml - špatný - vyžaduje přebalení, aby bylo možné změnit konfiguraci
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml - pěkné , ale viz poslední možnost!!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml - pěkné , ale viz poslední možnost!!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml - nejlepší - zcela mimo aplikaci a automaticky skenováno na změny!!!

Context může pojmout vlastní Loader org.apache.catalina.loader.VirtualWebappLoader (dostupný v moderním Tomcatu 7, můžete přidat vlastní samostatnou třídu na váš .properties ) a Parameter (přístup přes FilterConfig.getServletContext().getInitParameter(name) ) a Environment (přístup přes new InitialContext().lookup("java:comp/env").lookup("name") ):

<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
    <Resources className="org.apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>

    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>

Pokud používáte Spring a je to XML config:

<context:property-placeholder location="classpath:app.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.user}"/>
    <property name="username" value="${db.user}"/>
    <property name="password" value="${db.pass}"/>
</bean>

S pružinou je vstřikování výše uvedených vlastností do fazolových polí snadné:

@Value("${db.user}") String defaultSchema;

místo JNDI:

@Inject ApplicationContext context;
Enviroment env = context.getEnvironment();
String defaultSchema = env.getProperty("db.user");

Všimněte si také, že EL to umožňuje (výchozí hodnoty a hluboká rekurzivní substituce):

@Value('${db.user:testdb}') private String dbUserName;

<property name='username' value='${db.user.${env}}'/>

Viz také:

  • Přidání adresáře do třídy tomcat classpath
  • Mohu vytvořit vlastní cestu ke třídě pro jednotlivé aplikace v Tomcat
  • Jak číst soubor vlastností mimo kontext mé webové aplikace v Tomcat
  • Nakonfigurujte Tomcat tak, aby používal soubor vlastností k načítání informací o připojení DB
  • Měli byste nastavit vlastnosti připojení k databázi v server.xml nebo context.xml
  • Externalizovat konfiguraci Tomcat

POZNÁMKA Díky rozšíření classpath na živý adresář jste také umožnili externilizovat jakékoli další konfigurace , jako je protokolování, ověřování atd. Externě používám logback.xml takovým způsobem.

AKTUALIZACE Tomcat 8 změnil syntaxi pro <Resources> a <Loader> prvků, odpovídající část nyní vypadá takto:

<Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>

Vaše tomcat/conf/Catalina/<host> může obsahovat kontextové deskriptory, které vám umožňují konfigurovat spoustu věcí, včetně definování „položky prostředí“, které jsou přístupné z Javy přes JNDI. Existuje mnoho způsobů, jak jej používat. Osobně jsem nastavil položku prostředí, což je cesta souborového systému k mému souboru vlastností. Moje aplikace je vytvořena tak, aby zkontrolovala tento záznam, a pokud neexistuje, vyhledejte soubor na cestě ke třídě. Tímto způsobem v dev máme vlastnosti dev přímo na cestě třídy, ale když je sestavujeme a nasazujeme, odkazujeme je na externí soubor.

Existuje dobrá dokumentace pro konfiguraci kontextu na webu Tomcat. Viz Definování kontextu sekce s podrobnostmi o tom, jak vytvořit soubor a kam jej umístit.

Například pokud se váš hostitel jmenuje myHost a vaše aplikace je válečný soubor s názvem myApp.war v webapps adresář, pak můžete vytvořit tomcat/conf/Catalina/myHost/myApp.xml s tímto obsahem:

<Context>
    <Environment name="configurationPath" value="/home/tomcat/myApp.properties" type="java.lang.String"/>
</Context>

Pak byste ze svého kódu provedli vyhledávání JNDI na java:comp/env/configurationPath (zde 95% jistota), abyste získali hodnotu řetězce.


Můžete zkusit umístit svou konfiguraci (soubor vlastností) do Apache Tomcat\lib v souboru JAR a odstranit ji z webové aplikace. Když zavaděč třídy Tomcat nenajde vaši konfiguraci ve webové aplikaci, pokusí se ji najít v adresáři „lib“. Svou konfiguraci tedy můžete externalizovat pouhým přesunem konfigurace do globálního adresáře knihovny (je sdílena mezi ostatními webovými aplikacemi).


Linux
  1. Jak vykopat soubor z Awk?

  2. Vytvořit data pro čtení textu ze souboru?

  3. Čtení Grepových vzorů ze souboru?

  1. Vytvořte PEM ze souboru PPK

  2. Jak se install -c liší od cp

  3. Jak zablokovat přístup k souboru, aby nebyl obsluhován službou Tomcat?

  1. Rozlišovat Ls na výstupu skripty od binárních souborů?

  2. Jak odstranit Bom ze souboru UTF-8?

  3. Awk z různých řádků?