Apache Tomcat 7.0、CentOS 5.8 i386
Web 应用程序需要特定的环境变量XY才能出现在其上下文中。该变量在/etc/profile中设置为计算的结果(即不是静态值),并且它也被运行在同一系统上的其他本机应用程序使用(因此它必须是环境变量方法)。
Tomcat 是通过使用专用 tomcat 用户和sudo的通用脚本启动的。通过sudo传递XY的第一个问题通过/etc/sudoers中的显式定义得到解决(感谢 stackoverflow):
Defaults env_keep ="XY"
这意味着环境变量XY由sudo保留,这不是默认情况。
现在环境变量XY在 tomcat 进程中是可见的。这可以通过ps和/proc/tomcat-PID/environ或 */your_tomcat/bin/startup.sh* 中的显式echo $XY(由 init.d 脚本使用sudo调用)来验证。但是在tomcat进程中看到XY并不代表web app可以看到。Web 应用程序将其环境转储到日志文件中
LOGGER.debug("Environment: " + System.getenv());
令我惊讶的结果是:根本没有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>
现在System.getenv()的输出确实包含我的XY环境变量,但它具有来自/etc/profile的正确值,而不是我在context.xml中指定的值INIT_VALUE。换句话说,我的/etc/profile确实覆盖了INIT_VALUE,这是我需要的,但不是我所期望的,因为文档中没有关于此的消息。
我是否发现可能在更高版本的 tomcat 中删除的未记录行为,或者这是要走的路?所以最后我很高兴有一个可行的解决方案,但我不太相信这是一种推荐的和正确的传递环境变量的方法。任何意见将不胜感激。