Apache Tomcat 7.0,CentOS 5.8 i386
Web应用程序需要特定的环境变量XY才能在其上下文中出现.此变量在/ etc/profile中作为计算结果(即非静态值)设置,并且也由在同一系统上运行的其他本机应用程序使用(因此它必须是环境变量方法).
Tomcat是使用专用tomcat用户和sudo的通用脚本启动的.通过/ etc/sudoers中的显式定义解决了(通过stackoverflow)传递XY到sudo的第一个问题:
Defaults env_keep ="XY"
Run Code Online (Sandbox Code Playgroud)
这意味着环境变量XY由sudo保留,这不是默认情况.
现在,环境变量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 …