Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tomcat 8 - context.xml use Environment Variable in Datasource

I have a Tomcat 8 project that uses a datasource (see below)

<Resource auth="Container" 
          name="jdbc/JtmDS"  
          driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
          type="javax.sql.DataSource" 
          username="xfer"
          password="xfer10" 
          url="jdbc:derby:/home/PUID/tm/control/JtmDB"                    
          initialSize="25"
          maxTotal="100" 
          maxIdle="30" 
          maxWaitMillis="10000"                                      
          removeAbandonedOnBorrow="true"
          removeAbandonedTimeout="20" />

This works perfectly well.

However the url is a hard-coded path /home/PUID/tm/control/JtmDB

When this gets into production the PUID part of the path will differ across numerous systems. I have an environment variable set export PUID=abcd The rest of the application is able to use things like System.getenv( ) or ${env:PUID} as and where appropriate.

These all work fine.

My question is very simply: How can I make the PUID value in my context.xml a variable that can be read from an environment variable?

like image 679
thonnor Avatar asked Jun 26 '17 14:06

thonnor


People also ask

How do I set an environment variable in Tomcat?

Environment variables can be set, by creating a setenv. bat (windows) or setenv.sh (unix) file in the bin folder of your tomcat installation directory. However, environment variables will not be accessabile from within your code. System properties are set by -D arguments of the java process.

Where do I put the context path in server xml?

xml. The second option is to set the context path of the application in the server. xml (which is located at $CATALINA_HOME\conf). Note: defining the context path manually has the side effect that the application is deployed twice by default: at http://localhost:8080/ExampleApp/ as well as at http://localhost:8080/.

What is the use of context xml in Tomcat?

In Tomcat, the Context Container represents a single web application running within a given instance of Tomcat. A web site is made up of one or more Contexts. For each explicitly configured web application, there should be one context element either in server. xml or in a separate context XML fragment file.


1 Answers

I finally discovered what I actually needed to do here.... Quite simple in the end.

I passed in a java parameter to Tomcat at runtime as shown below.

I added the following bits to setenv.sh

export PUID=abcd

JAVA_OPTS=-Dpuid=${PUID} 

Then edited my context.xml as shown here

<Resource auth="Container" 
          name="jdbc/JtmDS"  
          driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
          type="javax.sql.DataSource" 
          username="xfer"
          password="xfer10" 
          url="jdbc:derby:/home/${puid}/tm/control/JtmDB"                    
          initialSize="25"
          maxTotal="100" 
          maxIdle="30" 
          maxWaitMillis="10000"                                      
          removeAbandonedOnBorrow="true"
          removeAbandonedTimeout="20" />

So now my Tomcat installation will read this and be able to use a different path for each different PUID.


Background: This works because Tomcat will automatically perform variable substition in its configuration files:

Tomcat configuration files are formatted as schemaless XML; elements and attributes are case-sensitive.

Apache Ant-style variable substitution is supported; a system property with the name propname may be used in a configuration file using the syntax ${propname}. All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file.

Apache Tomcat 9 Configuration Reference - Overview

The part:

JAVA_OPTS=-Dpuid=${PUID}

describe above is necessary because Tomcat will only read Java system properties (which are provided by the JVM), but not environment variables (which are provided by the OS/runtime libraries that the JVM is running on). The parameter -D sets a Java system property from the environment variable of the same name.

like image 164
thonnor Avatar answered Oct 14 '22 00:10

thonnor