关于application.properties文件和环境变量

时间:2010-02-15 03:29:35

标签: java configuration environment-variables

当我将路径配置如下时,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文件中使用环境变量吗?

6 个答案:

答案 0 :(得分:19)

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

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

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

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

希望有所帮助。

答案 1 :(得分:15)

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();
}

答案 2 :(得分:12)

这是对的。 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");

希望这会对很多人有所帮助,这样他们就不必从任何地方挑选零碎碎片,这需要很长时间才能解决手头的问题。

答案 3 :(得分:6)

查看Commons configuration

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

答案 4 :(得分:2)

Apache Commons项目扩展了属性文件的处理,允许你use environment variables(参见变量解释部分)。那么你应该能够得到你想要的东西:

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

答案 5 :(得分:0)

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的警告,以及一些无法在其中配置的环境变量的例外。