Regarding application.properties file and environm

2019-02-04 03:53发布

问题:

Java successfully recognizes the path in my application.properties file when I have the path configured as below:

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

If I try using an environment variable, the Java program doesn't recognize the path.

(the environmental variable TOM_DATA is set as /kcs.)

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

Can I use an environment variable inside application.properties file?

回答1:

You can put environment variables in your properties file, but Java will not automatically recognise them as environment variables and therefore will not resolve them.

In order to do this you will have to parse the values and resolve any environment variables you find.

You can get at environment variables from Java using various methods. For example: Map<String, String> env = System.getenv();

There's a basic tutorial here: http://java.sun.com/docs/books/tutorial/essential/environment/env.html

Hope that's of some help.



回答2:

Tom Duckering's answer is correct. Java doesn't handle this for you.

Here's some code utilizing regular expressions that I wrote to handle environment variable substitution:

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


回答3:

That is right. Java does not handle substituting the value of the environment variables. Also Java might not recognise variables like $EXT_DIR. While using such variables you might encounter FileNotFoundException. But Java will recognise the variables that are defined with -D in catalina.sh. What I mean by this, is suppose you have such a definition in catalina.sh

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

In your properties file use ${web.external.dir} instead of using *$EXT_DIR*. And while accessing this property in your code you could do it this way:

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

Hope this will help a lot of people so they won't have to pick bits and pieces from everywhere which takes really long to resolve an issue at hand.



回答4:

Have a look at Commons configuration

Or alternatively use relative paths in your properties file, and load the base directory via command line as a system property. That way the property files remain independent of where the application is actually deployed.



回答5:

The Apache Commons project has expanded handling of properties files that lets you use environment variables (see the Variable Interpretation section). Then you should be able to get what you want using:

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