GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Externalisierung der Tomcat-Webanwendungskonfiguration aus der .war-Datei

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


Linux
  1. Lesen von Grep-Mustern aus einer Datei?

  2. Rufen Sie den Dateinamen aus dem Dateideskriptor in C ab

  3. Erstellen Sie eine PEM aus einer PPK-Datei

  4. Wie unterscheidet sich install -c von cp

  5. Wie unterscheidet sich cp -f von cp --remove-destination?

Verwenden der SSH-Konfigurationsdatei

So erstellen Sie Verzeichnisse aus einer Textdatei unter Linux

So entfernen Sie ein Passwort aus einer PDF-Datei unter Linux

So entfernen Sie (^M) Zeichen aus einer Datei in Linux

Datei von windows nach linux kopieren

Wie kann der Zugriff auf eine Datei blockiert werden, die von Tomcat bereitgestellt wird?