将环境变量传递到Tomcat 7.0 Web应用程序上下文

run*_*tta 3 variables environment tomcat sudo context.xml

Apache Tomcat 7.0,CentOS 5.8 i386

Web应用程序需要特定的环境变量XY才能在其上下文中出现.此变量在/ etc/profile中作为计算结果(即非静态值)设置,并且也由在同一系统上运行的其他本机应用程序使用(因此它必须是环境变量方法).

Tomcat是使用专用tomcat用户和sudo的通用脚本启动的.通过/ etc/sudoers中的显式定义解决了(通过stackoverflow)传递XYsudo的第一个问题:

Defaults    env_keep ="XY"
Run Code Online (Sandbox Code Playgroud)

这意味着环境变量XYsudo保留,这不是默认情况.

现在,环境变量XY在tomcat进程中可见.这可以使用ps/ proc/tomcat-PID/environ或*/your_tomcat/bin/startup.sh*中的显式echo $ XY进行验证(使用sudo由init.d脚本调用).但是在tomcat进程中查看XY并不意味着Web应用程序可以看到它.借助于Web应用程序将其环境转储到日志文件中

LOGGER.debug("Environment: " + System.getenv());  
Run Code Online (Sandbox Code Playgroud)

令我惊讶的结果是:没有XY,尽管tomcat拥有它!

在阅读了tomcat 7.0的上下文文档后(注意区分7.0和更早版本的tomcat),我在*/your_tomcat/conf/context.xml*中添加了以下条目:

<Context>
...
<Environment name="XY" value="INIT_VALUE" type="java.lang.String"/>  
...
</Context>
Run Code Online (Sandbox Code Playgroud)

现在System.getenv()的输出确实包含我的XY环境变量但是它具有来自/ etc/profile的正确值而不是我在context.xml中指定的值INIT_VALUE.换句话说,我的/ etc/profile确实会覆盖INIT_VALUE,这是我需要的,但不是我所期望的,因为在文档中没有关于这个的说法.

我是否发现可能在更高版本的tomcat中删除的未经过文档化的行为,或者这是要走的路?所以最后我很高兴有一个可行的解决方案,但我不是很有信心这是一种推荐和正确的传递环境变量的方法.任何评论都将受到高度赞赏.

小智 8

Tomcat Environment条目与系统环境变量不同.<Environment>标记指定的环境条目是JNDI,可以使用InitialContext.lookupunder 访问java:/comp/env,System.getEnv()而是关于系统环境变量(tomcat进程本身).