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中删除的未经过文档化的行为,或者这是要走的路? 所以最后我很高兴有一个可行的解决方案,但我不是很有信心这是一种推荐和正确的传递环境变量的方法。 任何评论都将受到高度赞赏。
答案 0 :(得分:8)
Tomcat环境条目与系统环境变量不同。 <Environment>
标记指定的环境条目是JNDI,可以使用InitialContext.lookup
下的java:/comp/env
访问,而System.getEnv()
是关于系统环境变量(tomcat进程本身)。