Tomcat 8 - context.xml 在数据源中使用环境变量

Tomcat 8 - context.xml use Environment Variable in Datasource

我有一个使用数据源的 Tomcat 8 项目(见下文)

<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" />

这非常有效。

但是 url 是硬编码路径 /home/PUID/tm/control/JtmDB

当它投入生产时,路径的 PUID 部分将在许多系统中有所不同。 我设置了一个环境变量 export PUID=abcd 应用程序的其余部分可以在适当的时候使用 System.getenv( )${env:PUID} 之类的东西。

这些都很好。

我的问题很简单: 如何使 context.xml 中的 PUID 值成为可以从环境变量中读取的变量?

我终于发现了我真正需要做的事情....最后很简单。

我在运行时将 java 参数传递给 Tomcat,如下所示。

我将以下位添加到 setenv.sh

export PUID=abcd

JAVA_OPTS=-Dpuid=${PUID} 

然后编辑我的 context.xml,如下所示

<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" />

所以现在我的 Tomcat 安装将读取这个并且能够为每个不同的 PUID 使用不同的路径。


背景:之所以可行,是因为Tomcat会在其配置文件中自动执行变量替换:

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

部分:

JAVA_OPTS=-Dpuid=${PUID}

上面的描述是必要的,因为 Tomcat 只会读取 Java system properties(由 JVM 提供),而不是环境变量(由 OS/runtime 库提供JVM 运行 开启)。 参数-D从同名环境变量中设置一个Java系统属性。