将用户定义的环境变量传递给 tomcat

Posted

技术标签:

【中文标题】将用户定义的环境变量传递给 tomcat【英文标题】:Pass user defined environment variable to tomcat 【发布时间】:2013-06-05 20:01:36 【问题描述】:

我正在使用 Eclipse 进行 Web 应用程序编码。在此我传递了环境变量,例如:

    项目--> 运行方式--> 运行配置。并选择了环境选项卡。 添加名称为 APP_MASTER_PASSWORD 的新环境变量及其值。

我可以在 java 代码中以System.getenv("APP_MASTER_PASSWORD") 访问这个值。

但现在我想将此环境变量传递给 tomcat 并在应用程序中访问它,而不是通过 eclipse 传递。

那么我怎样才能将这样的变量传递给 tomcat?

我搜索了一下。但我没有得到任何解决方案。

【问题讨论】:

没有使用 Tomcat 虚拟主机的选项吗?如果您有多个应用程序副本正在运行,这些环境设置并不方便。我相信它们被称为“环境条目”? 【参考方案1】:

您可以使用 setenv.bat 或 .sh 将环境变量传递给 Tomcat。

创建CATALINA_BASE/bin/setenv.bat 或.sh 文件并在其中放入以下行,然后启动Tomcat。

在 Windows 上:

set APP_MASTER_PASSWORD=foo

在类 Unix 系统上:

export APP_MASTER_PASSWORD=foo

【讨论】:

我相信这是 Ubuntu 特有的情况。例如,对于 Red Hat,您可以编辑 CATALINA_HOME/tomcat7.conf 这有点晚了,但是...根据Tomcat's documentation,创建 setenv.sh 应该适用于任何风格的 Unix。 catalina.sh脚本会检查setenv.sh是否存在,如果存在,在启动过程中执行。 catalina.sh 检查CATALINA_BASE/bin/setenv.shCATALINA_HOME/bin/setenv.sh,如果存在则执行它们。 你可以创建一个 setenv.sh 脚本,如果它还没有的话【参考方案2】:

在这种情况下,您应该使用系统属性而不是环境变量。编辑 JAVA_OPTS 的 tomcat 脚本并添加如下属性:

-DAPP_MASTER_PASSWORD=foo

在你的代码中,写

System.getProperty("APP_MASTER_PASSWORD");

您也可以在 Eclipse 中执行此操作,而不是 JAVA_OPTS,复制运行配置中 VM 参数中的行。

【讨论】:

【参考方案3】:

<Environment> 标记指定的环境条目是 ​​JNDI,可使用 java:/comp/env 下的 InitialContext.lookup 访问。您可以使用InitialContext 构造函数和application resource files 的环境参数来为JNDI 指定环境属性。

System.getEnv()是关于tomcat进程本身的系统环境变量。

使用 bash 命令设置环境变量: export TOMCAT_OPTS=-Dmy.bar=foo 并启动Tomcat: ./startup.sh 要检索系统属性 bar 的值,请使用 System.getProperty()System.getEnv() 可用于检索环境变量,即TOMCAT_OPTS

【讨论】:

今天是 CATALOINA_OPTS - 但除此之外,这对我有帮助!【参考方案4】:

环境变量可以通过在您的tomcat安装目录的bin文件夹中创建setenv.bat(windows)或setenv.sh(unix)文件来设置。但是,环境变量将无法从您的代码中访问。

系统属性由 java 进程的-D 参数设置。你可以在环境变量JAVA_OPTS中定义java起始参数。

我的建议是这两种机制的组合。在你的apache-tomcat-0.0.0\bin\setenv.bat 写:

set JAVA_OPTS=-DAPP_MASTER_PASSWORD=password1

在你的 Java 代码中写:

System.getProperty("APP_MASTER_PASSWORD")

【讨论】:

【参考方案5】:

对于 Unix 和 Mac 系统,转到 tomcat 文件夹中的 /bin/setenv.sh

添加下面一行

export JAVA_OPTS="$JAVA_OPTS -DAPP_MASTER_PASSWORD=mypass"

现在System.getProperty("APP_MASTER_PASSWORD") 将返回"mypass"

【讨论】:

【参考方案6】:

如果您从 Eclipse(“服务器”视图)启动 Tomcat,那么您应该有一个名为“Apache Tomcat / Tomcat ...”的“运行/运行配置”(菜单)条目。当您在运行配置列表中选择此条目时,您会看到一个带有多个选项卡的窗口,其中一个标记为“环境”。您可以在那里为您的 Tomcat 配置环境变量。之后一定要重启 Tomcat。

【讨论】:

【参考方案7】:

如果是 Windows,如果找不到 setenv.bat,请在 catalina.bat 的第二行(@echo off 之后)添加: SET APP_MASTER_PASSWORD=foo

可能不是最好的方法,但有效

【讨论】:

【参考方案8】:

我的解决方法:

    DID NOT WORK >> 设置为系统环境变量:我已经在我的 mac 中设置了环境变量 bash_profile,但是,Tomcat 没有看到该变量。

    DID NOT WORK >> setenv.sh:Apache 的建议是在 setenv.sh 文件中包含用户定义的环境变量,我这样做了。

    成功了!! >> 在对 Tomcat 启动脚本进行了一些研究后,我发现使用 setenv.sh 设置的环境变量在启动过程中丢失了。所以我不得不根据 Apache 的建议编辑我的catalina.sh,这样就成功了。

catalina.sh 的运行命令中添加您的-DUSER_DEFINED 变量。

eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
  -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  -DUSER_DEFINED="$USER_DEFINED" \
  org.apache.catalina.startup.Bootstrap "$@" start

P.S: 这个问题可能是我电脑本地的。其他人会有不同的问题。在这篇文章中添加我的答案,以防万一有人在尝试所有推荐的方法后仍然面临 Tomcat 看不到环境变量的问题。

【讨论】:

以上是关于将用户定义的环境变量传递给 tomcat的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量传递给 application.yml

将环境变量传递给 XCUITest

将环境变量传递给大型机 JVM

将预处理器变量传递给 nmake 构建环境

你可以将环境变量传递给xcodebuild吗?

如何将环境变量传递给pytest