【问题标题】:Regarding application.properties file and environment variable关于 application.properties 文件和环境变量
【发布时间】:2011-01-16 20:40:46
【问题描述】:

当我将路径配置如下时,Java 成功识别了我的 application.properties 文件中的路径:

pathToInputFile=/kcs/data/incoming/ready/
pathToInputFileProcess=/kcs/data/incoming/work/

如果我尝试使用环境变量,Java 程序将无法识别路径。

(环境变量TOM_DATA设置为/kcs。)

pathToInputFile=${TOM_DATA}/data/incoming/ready/
pathToInputFileProcess=${TOM_DATA}/data/incoming/work/

我可以在 application.properties 文件中使用环境变量吗?

【问题讨论】:

    标签: java configuration environment-variables


    【解决方案1】:

    您可以将环境变量放在属性文件中,但 Java 不会自动将它们识别为环境变量,因此不会解析它们。

    为了做到这一点必须解析值并解析你找到的任何环境变量。

    您可以使用各种方法从 Java 获取环境变量。例如:Map<String, String> env = System.getenv();

    这里有一个基础教程:http://java.sun.com/docs/books/tutorial/essential/environment/env.html

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      看看Commons configuration

      或者在属性文件中使用相对路径,并通过命令行加载基本目录作为系统属性。这样,属性文件就独立于应用程序的实际部署位置。

      【讨论】:

        【解决方案3】:

        Tom Duckering 的回答是正确的。 Java 不会为您处理这个问题。

        以下是我编写的一些使用正则表达式来处理环境变量替换的代码:

        /*
         * Returns input string with environment variable references expanded, e.g. $SOME_VAR or ${SOME_VAR}
         */
        private String resolveEnvVars(String input)
        {
            if (null == input)
            {
                return null;
            }
            // match ${ENV_VAR_NAME} or $ENV_VAR_NAME
            Pattern p = Pattern.compile("\\$\\{(\\w+)\\}|\\$(\\w+)");
            Matcher m = p.matcher(input); // get a matcher object
            StringBuffer sb = new StringBuffer();
            while(m.find()){
                String envVarName = null == m.group(1) ? m.group(2) : m.group(1);
                String envVarValue = System.getenv(envVarName);
                m.appendReplacement(sb, null == envVarValue ? "" : envVarValue);
            }
            m.appendTail(sb);
            return sb.toString();
        }
        

        【讨论】:

        • 那么,如何连接到application.properties
        【解决方案4】:

        没错。 Java 不处理替换环境变量的值。 此外,Java 可能无法识别像 $EXT_DIR 这样的变量。在使用此类变量时,您可能会遇到 FileNotFoundException。 但是 Java 会识别在 catalina.sh 中用 -D 定义的变量。我的意思是,假设你在 catalina.sh 中有这样的定义

        CATALINA_OPTS="-Dweb.external.dir="$EXT_DIR"
        

        在您的属性文件中使用 ${web.external.dir} 而不是使用 *$EXT_DIR*。 在您的代码中访问此属性时,您可以这样做:

        String webExtDir = System.getProperty("web.external.dir");
        

        希望这将帮助很多人,这样他们就不必从各处挑选零碎的东西,这需要很长时间才能解决手头的问题。

        【讨论】:

          【解决方案5】:

          Apache Commons 项目扩展了对属性文件的处理,使您可以use environment variables(特别是,请参阅变量插值部分)。然后你应该能够得到你想要的东西:

          pathToInputFile=${env:TOM_DATA}/data/incoming/ready/
          

          【讨论】:

            【解决方案6】:

            Apache Tomcat 有一个用于设置环境变量的可选脚本。在文档中,它说“所有环境变量都可以在“setenv”脚本中指定”(Windows 为 .bat,Linux 为 .sh)。

            https://tomcat.apache.org/tomcat-9.0-doc/RUNNING.txt 中的第 3.4 节

            由于它是一个脚本而不是静态配置,因此可以从中创建属性文件。这种模式对我来说适用于环境配置的 S3 连接,但这里是为您的示例重写的,以及如何设置属性文件位置的好处:

            cat > "${CATALINA_HOME}/conf/application.properties" <<EOF
            pathToInputFile=${TOM_DATA}/data/incoming/ready/
            pathToInputFileProcess=${TOM_DATA}/data/incoming/work/
            EOF
            CATALINA_OPTS="${CATALINA_OPTS} -DTOM_DATA=${TOM_DATA}"
            CATALINA_OPTS="${CATALINA_OPTS} -Dapplication.properties.location=${CATALINA_HOME}/conf/application.properties"
            
            export CATALINA_OPTS
            

            如果您配置运行时内容(例如内存限制、无头模式或要使用的垃圾收集),您可能已经在使用此文件。

            注意:文档对何时不调用 setenv 以及一些无法在其中配置的环境变量有一些例外情况。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-11-15
              • 2016-06-08
              • 2020-09-18
              • 1970-01-01
              • 2020-06-11
              • 2021-05-31
              • 2019-09-11
              相关资源
              最近更新 更多