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

时间:2012-09-17 08:22:33

标签: variables tomcat environment sudo context.xml

Apache Tomcat 7.0,CentOS 5.8 i386

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

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

Defaults    env_keep ="XY"

这意味着环境变量 XY sudo 保留,这不是默认情况。

现在,在tomcat进程中可以看到环境变量 XY 。这可以通过 ps / proc / tomcat-PID / environ 或* / your_tomcat / bin / startup中的显式 echo $ XY 进行验证.sh *(由init.d脚本使用 sudo 调用)。但是在tomcat进程中看到 XY 并不意味着Web应用程序可以看到它。 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中删除的未经过文档化的行为,或者这是要走的路? 所以最后我很高兴有一个可行的解决方案,但我不是很有信心这是一种推荐和正确的传递环境变量的方法。 任何评论都将受到高度赞赏。

1 个答案:

答案 0 :(得分:8)

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