20. März 2018
Einer Webanwendung, die auf Tomcat ausgeführt wird, können mit Hilfe des Java Naming and Directory Interface (JNDI) Parameter übergeben werden. In der Datei [CATALINA_BASE]/conf/context.xml
wird dazu ein Eintrag gemacht wie im folgenden Beispiel
<Environment name="testParam" type="java.lang.String" value="Ein Test-Parameter" override="false" />
Dieser Eintrag lässt sich beispielsweise wie in folgendem Servlet lesen und ausgeben
public class Test extends HttpServlet { public static final String JNDI_CTX_NAME = "java:comp/env"; public static final String PARAM_NAME = "testParam"; public static final String NOT_FOUND = " nicht gefunden"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String param = getJNDIParameter(PARAM_NAME); Writer w = resp.getWriter(); if(param == null) { w.write(PARAM_NAME); w.write(NOT_FOUND); } else { w.write(param); } w.flush(); w.close(); } private String getJNDIParameter(String pname) { String param = null; try { // unseren environment naming context ermitteln Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup(JNDI_CTX_NAME); // unseren Parameter lesen param = (String) envCtx.lookup(pname); } catch (NamingException ex) { Logger.getLogger(Test.class.getName()).log(Level.SEVERE, ex.getMessage()); } return param; } }
Der Vorteil eines globalen Eintrags wie oben ist, dass er z.B. die Neuinstallation der App überdauert. Änderungen am Eintrag werden zudem ohne die Erfordernis eines Neustarts wirksam und können gemacht werden während Tomcat läuft.
Die Datei [CATALINA_BASE]/conf/context.xml
ist zwar Bestandteil der Tomcat-Installation was z.B. in einem containerisierten Umfeld ein eigenes Image erfordern würde, um eine eigene Variante dieser Datei mit Tomcat anzuwenden. Das ist allerdings ebenso für nahezu jede produktive Tomcat-Instanz nötig, weil nun einmal viele Einstellungen in [CATALINA_BASE]/conf
gemacht werden müssen, z.B. auch in server.xml
. Es muss also eigentlich immer vom Standard-Paket von Tomcat abgewichen und ein eigenes Image verwendet werden.
Stattdessen kann der Eintrag übrigens auch in [CATALINA_BASE]/ conf/ Catalina/ localhost/ [contextname].xml
gemacht werden. Hier besteht aber die Gefahr, dass bei der Neuinstallation der App der Eintrag überschrieben wird (sollte mal ausprobiert werden...). Dasselbe gilt für Einträge in [CATALINA_BASE]/webapps/[context]/WEB-INF/web.xml
sowie [CATALINA_BASE]/webapps/[context]/META-INF/context.xml
wo ebenfalls JNDI-Einträge und auch Context Parameter hinterlegt werden können.
Mit Hilfe von JNDI lassen sich Apps ohne Eingriff in ihren Code konfigurieren. Mit Tomcat können solche Konfigurationsparameter ohne Erfordernis eines Neustarts im laufenden Betrieb vorgenommen und geändert werden. Ein JNDI-Parameter überdauert die Neuinstallation einer App, wenn er als globaler Parameter in der Konfiguration von Tomcat unter [CATALINA_BASE]/conf hinterlegt wird.