Относительно файла application.properties и переменной среды - PullRequest
29 голосов
/ 15 февраля 2010

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?

Ответы [ 5 ]

19 голосов
/ 15 февраля 2010

Вы можете поместить переменные среды в свой файл свойств, но Java не будет автоматически распознавать их как переменные среды и, следовательно, не разрешит их.

Чтобы сделать это , вам придется проанализировать значения и разрешить любые переменные окружения, которые вы найдете.

Вы можете получить переменные окружения из Java, используя различные методы. Например: Map<String, String> env = System.getenv();

Здесь есть базовое руководство: http://java.sun.com/docs/books/tutorial/essential/environment/env.html

Надеюсь, это поможет.

15 голосов
/ 15 марта 2012

Том Дакеринг ответит правильно. 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();
}
12 голосов
/ 13 августа 2013

Это верно. Java не обрабатывает подстановку значений переменных среды. Также Java может не распознавать такие переменные, как $ EXT_DIR . При использовании таких переменных вы можете встретить FileNotFoundException . Но Java распознает переменные, которые определены с -D в catalina.sh . Я имею в виду, что у вас есть такое определение в catalina.sh

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

В вашем файле свойств используйте $ {web.external.dir} вместо использования * $ EXT_DIR *. И при доступе к этому свойству в вашем коде вы можете сделать это следующим образом:

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

Надеюсь, что это поможет многим людям, поэтому им не придется собирать осколки отовсюду, что действительно занимает много времени для решения проблемы.

6 голосов
/ 15 февраля 2010

Посмотрите на Общая конфигурация

Или же используйте относительные пути в файле свойств и загрузите базовый каталог через командную строку в качестве системного свойства. Таким образом, файлы свойств остаются независимыми от того, где фактически развернуто приложение.

4 голосов
/ 15 марта 2018

В проекте Apache Commons расширена обработка файлов свойств, что позволяет использовать переменные среды (см. Раздел Интерпретация переменных). Тогда вы сможете получить то, что хотите, используя:

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