server.xml 中的环境/系统变量

Posted

技术标签:

【中文标题】server.xml 中的环境/系统变量【英文标题】:Environment/system variables in server.xml 【发布时间】:2012-08-09 04:52:11 【问题描述】:

如何在tomcat server.xml、context.xml等配置文件中使用环境/系统变量?

我尝试使用$ENV_VAR_NAME(用于环境和系统变量)、$env.ENV_VAR_NAME(用于环境变量)。似乎没有任何效果。

【问题讨论】:

你找到解决办法了吗? @DagR,很遗憾没有 【参考方案1】:

它是如何在我的盒子里实现的。

用于启动的 Bash 脚本:

#!/bin/sh

SMEMORY=1G
XMEMORY=1G

if [ $ENV == DEV ]; then
  port_shutdown="8005"
  port_http="8080"
  port_https="8443"
elif
  [ $ENV == SIT ]; then
  port_shutdown="8006"
  port_http="8081"
  port_https="8444"
elif
  [ $ENV == UAT ]; then
  port_shutdown="8007"
  port_http="8082"
  port_https="8445"
else
  echo "Unknown ENV"
  exit 1
fi

export CATALINA_OPTS=" $SYSTEM_PROPS -d64 -server -Xms$SMEMORY -Xmx$XMEMORY \
 -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=64M \
 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=1024M \
 -Dport.http=$port_http -Dport.https=$port_https -Dport.shutdown=$port_shutdown"

exec $CATALINA_HOME/bin/startup.sh

server.xml:

<Connector
  port="$port.http"
  protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="$port.https"
/>

看一下流程:

$ ps ux | grep tomcat
... -Xms1G -Xmx1G ... -Denv=KIEV_DEV... -Dport.http=8084 -Dport.https=8446 -Dport.shutdown=8008...

检查端口:

$ netstat -anp | grep java
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 :::8084                     :::*                        LISTEN      23343/java
tcp        0      0 :::8446                     :::*                        LISTEN      23343/java

【讨论】:

你能参考一下官方文档吗?谢谢! 所以简而言之,您正在使用自定义环境变量修改 tomcat 启动环境,然后可以从解析 tomcat xml 的环境(应用程序内存与基本 linux 环境)访问这些环境变量。所以换句话说,Tomcat 不能访问普通的 BASH 环境变量,但是你可以将它们注入到 Tomcat 环境中,使它们可以在 tomcat xmls 中被引用,对吗?【参考方案2】:

通过将系统属性org.apache.tomcat.util.digester.PROPERTY_SOURCE 设置为值org.apache.tomcat.util.digester.Digester$EnvironmentPropertySource,可以在server.xml 等中引用环境变量。

该系统属性从 7.0 开始可用,但直到 8.5 文档中才提到 EnvironmentPropertySource

https://tomcat.apache.org/tomcat-9.0-doc/config/systemprops.html

更新(2020 年 4 月):

最新的 tomcat 版本(9.0.34、8.5.54)现在支持大多数配置文件中的属性替换: https://tomcat.apache.org/tomcat-9.0-doc/changelog.html#Tomcat_9.0.34_(markt)

【讨论】:

小心,因为在不久的将来,类名中的$ 将更改为. 请参阅github.com/apache/tomcat/commit/… 如果您发现在 shell 脚本中使用美元符号很难玩,只需 echo 'org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.Digester$EnvironmentPropertySource' &gt;&gt; conf/catalina.properties 所以基本上将'org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.Digester$EnvironmentPropertySource'这一行添加到/tomcat/conf/catalina.properties?当tomcat启动时,它将使用环境变量解析server.xml中的令牌? @youfu @JonathanHagen 是的。 请注意 org.apache.tomcat.util.digester.Digester$EnvironmentPropertySource 现在已弃用,至少在 Tomcat 9.0.55 中是这样。替代方法是 org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource in catalina.properties:tomcat.apache.org/tomcat-9.0-doc/api/org/apache/tomcat/util/…

以上是关于server.xml 中的环境/系统变量的主要内容,如果未能解决你的问题,请参考以下文章

Win7系统中的环境变量PATH怎么修改

如何设置系统环境变量?

Makefile中要引用一个系统环境变量该怎么办

环境变量 | 如何理解 windows计算机中的环境变量,以及配置Java环境时配置的环境变量?

windows7-tomcat配置

[C++] 系统环境变量和用户变量同名 如何才能获取系统环境变量