Java 在字符串中插入环境变量

Java 在字符串中插入环境变量,java,environment-variables,string-interpolation,Java,Environment Variables,String Interpolation,我需要在字符串中展开环境变量。例如,在解析配置文件时,我希望能够读取以下内容 statsFile=${APP\u LOG\u DIR}/APP.stats 并获取一个值“/logs/myapp/app.stats”,其中环境变量app_LOG_DIR=“/logs/myapp” 这似乎是一种非常常见的需求,Logback框架等工具可以为自己的配置文件执行此操作,但我还没有找到一种规范的方法来为自己的配置文件执行此操作 注: 这不是许多“java字符串中的变量插值”问题的重复。我需要以特定的格式$

我需要在字符串中展开环境变量。例如,在解析配置文件时,我希望能够读取以下内容

statsFile=${APP\u LOG\u DIR}/APP.stats

并获取一个值“/logs/myapp/app.stats”,其中环境变量app_LOG_DIR=“/logs/myapp”

这似乎是一种非常常见的需求,Logback框架等工具可以为自己的配置文件执行此操作,但我还没有找到一种规范的方法来为自己的配置文件执行此操作

注:

  • 这不是许多“java字符串中的变量插值”问题的重复。我需要以特定的格式${ENV_VAR}插入环境变量

  • 这里也提出了同样的问题,但答案需要Spring框架,我不想为了完成这个简单的任务而引入这个巨大的依赖关系

  • 其他语言,如go,有一个简单的内置函数用于此:。我正在java中寻找类似的东西


  • 回答我自己的问题。感谢@radulfr在上述评论中的链接提供的线索,我找到了一个非常干净的解决方案,使用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;
            }
        }
    }
    

    回答我自己的问题。感谢@radulfr在上述评论中的链接提供的线索,我找到了一个非常干净的解决方案,使用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;
            }
        }
    }
    

    变量APP_LOG_DIR是一个环境变量或配置文件中的一个属性?APP_LOG_DIR是一个环境变量,我想在配置文件中使用${APP_LOG_DIR}语法引用它。这个怎么样:@radulfr,看起来与我需要的类似。对于这样一个常见的需求,我想会有一个解决方案,不需要编写自己的函数,但是,如果我找不到更好的方法,这可能会起作用。变量APP_LOG_DIR是一个环境变量或配置文件中的属性?APP_LOG_DIR是一个环境变量,我想在配置文件中使用${APP_LOG_DIR}语法引用它。这个如何:@radulfr,看起来与我需要的类似。对于这样一个常见的需求,我想会有一个解决方案,它不需要编写自己的函数,但如果我找不到更好的方法,它可能会起作用。