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系统属性。
我有一个使用数据源的 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系统属性。