Интерполяция переменных среды в строке - PullRequest
1 голос
/ 08 ноября 2019

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

statsFile=${APP_LOG_DIR}/app.stats

и получить значение "/logs/myapp/app.stats"где переменная окружения APP_LOG_DIR = "/logs/myapp".

Это кажется очень распространенной потребностью, и такие вещи, как инфраструктура Logback, делают это для своих собственных файлов конфигурации, но я не нашел канонического способаделать это для моих собственных файлов конфигурации.

Примечания:

  1. Это не дубликат многих "переменных интерполяции в строках Java"вопросов. Мне нужно интерполировать переменные окружения в определенном формате $ {ENV_VAR}.

  2. Здесь задавался тот же вопрос, Развернуть переменные env в строке , но для ответа требуется среда Spring, и я не хочу использовать эту огромную зависимость просто для выполнения этой простой задачи.

  3. В других языках, таких как go, естьПростая встроенная функция для этого: Интерполировать строку с ссылками на переменные окружения bash-like . Я ищу что-то подобное в Java.

1 Ответ

0 голосов
/ 08 ноября 2019

Отвечая на мой собственный вопрос. Благодаря подсказкам из ссылки @ radulfr в комментариях выше к Расширение переменных среды в тексте , я нашел довольно чистое решение, используя StrSubstitutor, здесь: https://dkbalachandar.wordpress.com/2017/10/13/how-to-use-strsubstitutor/

Подводя итог:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.StrLookup;
import org.apache.commons.lang3.text.StrSubstitutor;

public class StrSubstitutorMain {

    private static final StrSubstitutor envPropertyResolver = new StrSubstitutor(new EnvLookUp());

    public static void main(String[] args) {

        String sample = "LANG: ${LANG}";
        //LANG: en_US.UTF-8
        System.out.println(envPropertyResolver.replace(sample));

    }

    private static class EnvLookUp extends StrLookup {

        @Override
        public String lookup(String key) {
            String value = System.getenv(key);
            if (StringUtils.isBlank(value)) {
                throw new IllegalArgumentException("key" + key + "is not found in the env variables");
            }
            return value;
        }
    }
}
...