如果在命令行中提供了新值,如何覆盖从属性文件加载的值

时间:2017-07-27 07:53:57

标签: java command-line properties

有趣的是,有两个几乎完全相同的问题,我发现了类似的标题:

Q1

Q2

然而,我的情况似乎略有不同。

所以我有一个由config.properties类加载的ConfigurationGetter文件,如下所示:

public class ConfigurationGetter {

    Properties prop = new Properties();
    InputStream inputStream = null;

    public Properties getPropValues() throws IOException {

        try {
            String fileName = "config.properties";

            inputStream = getClass().getClassLoader().getResourceAsStream(fileName);

            if (inputStream != null) {
                prop.load(inputStream);
            } else {
                throw new FileNotFoundException("property file '" + fileName + "' not found in the classpath");
            }

        } catch (Exception e) {
            System.out.println("Exception: " + e);
        } finally {
            inputStream.close();
        }

        return prop;

    }

然后我在另一个类中实例化这个类:

ConfigurationGetter config = new ConfigurationGetter();
props = config.getPropValues();

然后我可以按键提取属性:

props.getProperty("keyName")

我想要做的是覆盖我从属性文件获得的值,如果我通过命令行提供它。例如,如果我在我加载的config.properties中有这样的一行,如上所述:

keyName=true

我也运行这样的代码:

mvn test -DkeyName=false

然后false将被解决。

1 个答案:

答案 0 :(得分:4)

加载属性文件后,我执行以下操作:

for (String propertyName : properties.stringPropertyNames()) {
    String systemPropertyValue = System.getProperty(propertyName);

    if (systemPropertyValue != null) {
        properties.setProperty(propertyName, systemPropertyValue);
    }
}

通过使用相应的系统属性值覆盖属性文件中的值(如果存在),可以为您提供所需的行为。