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