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

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

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

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

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

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

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

【问题讨论】:

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

标签: java tomcat web-applications


【解决方案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】:

            我的解决方法:

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

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

            3. 成功了!! >> 在对 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 看不到环境变量的问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-12-29
              • 2011-09-17
              • 2021-09-05
              • 2020-03-27
              • 2017-03-30
              • 2018-08-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多