如何使用Java加载外部属性文件而不重建Jar?

时间:2017-03-29 04:49:51

标签: java maven gradle

我使用gradle以maven风格构建项目,所以我有以下

src/main/java/Hello.javasrc/main/resources/test.properties

我的Hello.java看起来像这样

public class Hello {
    public static void main(String[] args) {
        Properties configProperties = new Properties();
        ClassLoader classLoader =  Hello.class.getClassLoader();
        try {
            configProperties.load(classLoader.getResourceAsStream("test.properties"));
            System.out.println(configProperties.getProperty("first") + " " + configProperties.getProperty("last"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这很好用。但是我希望能够在我的项目之外指向.properties文件,我希望它足够灵活,我可以指向任何位置而不是每次都重建jar 。有没有办法在不使用File API并将文件路径作为参数传递给main方法?

2 个答案:

答案 0 :(得分:2)

您可以尝试这个,它将首先尝试从项目主目录加载属性文件,这样您就不必重建jar,如果没有找到则会从classpath加载

public class Hello {

    public static void main(String[] args) {
        String configPath = "test.properties";

        if (args.length > 0) {
            configPath = args[0];
        } else if (System.getenv("CONFIG_TEST") != null) {
            configPath = System.getenv("CONFIG_TEST");
        }

        File file = new File(configPath);
        try (InputStream input = file.exists() ? new FileInputStream(file) : Hello.class.getClassLoader().getResourceAsStream(configPath)) {
            Properties configProperties = new Properties();
            configProperties.load(input);
            System.out.println(configProperties.getProperty("first") + " " + configProperties.getProperty("last"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

您可以将属性文件路径作为参数发送,或将路径设置为环境变量名称CONFIG_TEST

答案 1 :(得分:1)

对于这样一个简单的问题,

Archaius可能会完全矫枉过正,但这是管理外部属性的好方法。它是一个用于处理配置的库:配置层次结构,属性文件配置,数据库配置,用户定义源配置。它可能看起来很复杂,但您再也不用担心将半破解决方案再次手动滚动。 “入门”页面上有using a local file as the configuration source部分。