Ich mag .properties
Dateien statt
- JNDI - warum komplexe Objekte während der Programmkonfiguration erstellen statt Initialisierungszeit?
- Systemeigenschaften - Sie können nicht mehrere Instanzen derselben WAR in einem einzelnen Tomcat separat konfigurieren
- Kontextparameter - sie sind nur in
javax.servlet.Filter
zugänglich ,javax.servlet.ServletContextListener
was unbequem sein kann
Tomcat 7 Context Hold Loader-Element. Gemäß dem Bereitstellungsdeskriptor der Dokumentation (was in <Context>
-Tag) kann platziert werden in:
$CATALINA_BASE/conf/server.xml
- schlecht - erfordert Server-Neustarts, um die Konfiguration neu zu lesen$CATALINA_BASE/conf/context.xml
- schlecht - von allen Anwendungen geteilt$CATALINA_BASE/work/$APP.war:/META-INF/context.xml
- schlecht - Neupaketierung erforderlich, um die Konfiguration zu ändern$CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml
- nett , aber siehe letzte Option!!$CATALINA_BASE/webapps/$APP/META-INF/context.xml
- nett , aber siehe letzte Option!!$CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml
- am besten - komplett aus der Anwendung und automatisch auf Änderungen gescannt!!!
Context
kann benutzerdefinierte Loader
enthalten org.apache.catalina.loader.VirtualWebappLoader (verfügbar in modernem Tomcat 7, Sie können eigenen separaten Klassenpfad hinzufügen zu Ihrem .properties
) und Parameter
(Zugriff über FilterConfig.getServletContext().getInitParameter(name)
) und Environment
(Zugriff über 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>
Wenn Sie Spring und seine XML-Konfiguration verwenden:
<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>
Mit Spring ist es einfach, die oben genannten Eigenschaften in Bohnenfelder zu injizieren:
@Value("${db.user}") String defaultSchema;
statt JNDI:
@Inject ApplicationContext context;
Enviroment env = context.getEnvironment();
String defaultSchema = env.getProperty("db.user");
Beachten Sie auch, dass EL dies zulässt (Standardwerte und tiefe rekursive Substitution):
@Value('${db.user:testdb}') private String dbUserName;
<property name='username' value='${db.user.${env}}'/>
Siehe auch:
- Hinzufügen eines Verzeichnisses zum Tomcat-Klassenpfad
- Kann ich in Tomcat einen benutzerdefinierten Klassenpfad pro Anwendung erstellen
- So lesen Sie eine Eigenschaftendatei außerhalb meines Webapp-Kontexts in Tomcat
- Konfigurieren Sie Tomcat so, dass die Eigenschaftendatei zum Laden von DB-Verbindungsinformationen verwendet wird
- Sollten Sie Datenbankverbindungseigenschaften in server.xml oder context.xml einrichten
- Externalisieren Sie die Tomcat-Konfiguration
HINWEIS Mit der Erweiterung des Klassenpfads auf das Live-Verzeichnis haben Sie auch erlaubt, alle anderen Konfigurationen zu externilisieren , wie Protokollierung, auth, atc. Ich externilisiere logback.xml
so.
AKTUALISIEREN Tomcat 8 ändert die Syntax für <Resources>
und <Loader>
Elemente, der entsprechende Teil sieht nun so aus:
<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>
Ihr tomcat/conf/Catalina/<host>
kann Kontextdeskriptoren enthalten, mit denen Sie viele Dinge konfigurieren können, einschließlich der Definition von "Umgebungseinträgen", auf die von Java über JNDI zugegriffen werden kann. Es gibt viele Möglichkeiten, es zu verwenden. Persönlich habe ich einen Umgebungseintrag festgelegt, der der Dateisystempfad zu meiner Eigenschaftendatei ist. Meine App ist so aufgebaut, dass sie nach diesem Eintrag sucht, und wenn er nicht vorhanden ist, suchen Sie stattdessen nach der Datei im Klassenpfad. Auf diese Weise haben wir in dev die dev-Eigenschaften direkt im Klassenpfad, aber wenn wir bauen und bereitstellen, verweisen wir auf eine externe Datei.
Es gibt eine gute Dokumentation zum Konfigurieren eines Kontexts auf der Tomcat-Website. Siehe Einen Kontext definieren Abschnitt mit Einzelheiten zum Erstellen der Datei und zum Ablegen der Datei.
Als Beispiel, wenn Ihr Host myHost
heißt und Ihre App ist eine Kriegsdatei mit dem Namen myApp.war
im webapps
Verzeichnis, dann könnten Sie tomcat/conf/Catalina/myHost/myApp.xml
erstellen mit diesem Inhalt:
<Context>
<Environment name="configurationPath" value="/home/tomcat/myApp.properties" type="java.lang.String"/>
</Context>
Dann würden Sie von Ihrem Code aus eine JNDI-Suche nach java:comp/env/configurationPath
durchführen (95 % Sicherheit hier), um diesen Zeichenfolgenwert zu erhalten.
Sie können versuchen, Ihre Konfiguration (Eigenschaftendatei) in Apache Tomcat\lib in der JAR-Datei zu platzieren und sie aus der Webanwendung zu entfernen. Wenn der Klassenlader von Tomcat Ihre Konfiguration in der Webanwendung nicht findet, versucht er, sie im Verzeichnis „lib“ zu finden. Sie können Ihre Konfiguration also externalisieren, indem Sie die Konfiguration einfach in das globale lib-Verzeichnis verschieben (es wird von anderen Webapps gemeinsam genutzt).