将用户定义的环境变量传递给 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.sh
和CATALINA_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的主要内容,如果未能解决你的问题,请参考以下文章