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

我有一个使用数据源的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部分将在许多系统中有所不同。我有一个环境变量集 应用程序的其余部分能够在适当的时候使用类似或 as 之类的东西。export PUID=abcdSystem.getenv( )${env:PUID}

这些都工作正常。

我的问题非常简单:如何使上下文中的 PUID 值.xml可以从环境变量中读取的变量?


答案 1

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

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

我添加了以下位setenv.sh

export PUID=abcd

JAVA_OPTS=-Dpuid=${PUID} 

然后编辑了我的上下文.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 配置文件被格式化为无模式 XML;元素和属性区分大小写。

支持Apache Ant样式的变量替换;在配置文件中使用语法 ${propname} 时,可以在配置文件中使用名为 propname 的系统属性。所有系统属性都可用,包括使用 -D 语法设置的属性、JVM 自动提供的属性以及在 $CATALINA_BASE/conf/catalina.properties 文件中配置的属性。

Apache Tomcat 9 Configuration Reference - Overview

部分:

JAVA_OPTS=-Dpuid=${PUID}

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


答案 2

推荐