为什么我的Web应用程序项目中的属性文件未更新?

时间:2016-12-01 10:52:09

标签: java eclipse properties-file

我正在尝试在eclipse中的JSF Web应用程序项目中读取和编写包含所有服务器和数据库连接的属性文件。我使用log4j写入控制台。我的config.properties文件是:

dbserver=localhost
dbname=mydatabase;instance=myinstance
dbuser=myuser
dbpassword=mypassword

我将config.properties文件放在webapp / WEB-INF / classes文件夹中(这是类路径吗?)。我已经验证它正在这个特定位置正确读取文件,因为如果我删除该文件,它会中断。

在我的托管bean中,我有读取和写入config.properties文件的函数。

    public void getSettings() {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream input = classLoader.getResourceAsStream("config.properties");
    Properties properties = new Properties();
    try {
        properties.load(input);
        this.server = properties.getProperty("dbserver");
        this.db = properties.getProperty("dbname");
        this.user = properties.getProperty("dbuser");
        this.pass = properties.getProperty("dbpassword");
        logger.info("Config file successfully loaded!");            
    } catch (IOException e) {
        logger.error("Loading Database Settings Error with " + e);
    } finally {
        if (input != null) {
            try {
                input.close();
                logger.info("Closing config file...");
            } catch (IOException e) {
                logger.error("Error closing config file with " + e);
            }
        }
    }
}

public void saveSettings() {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    Properties props = new Properties();
    OutputStream out = null;
    try {
        props.setProperty("dbserver", this.server);
        props.setProperty("dbname", this.db);
        props.setProperty("dbuser", this.user);
        props.setProperty("dbpassword", this.pass);
        URL url = classLoader.getResource("config.properties");
        File file = null;
        try {
            file = new File(url.toURI().getPath());
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // File f = new File("config.properties");
        out = new FileOutputStream(file);
        props.store(out, "This is an optional header comment string");
        logger.info("Config file successfully saved!");
    } catch (IOException io) {
        logger.error("Saving configuration properties failed error with : " + io.getMessage());
    } finally {
        if (out != null) {
            try {
                logger.info("Closing config file...");
                out.close();
            } catch (IOException e) {
                logger.error("Failed closing configuration properties file error with : " + e);
            }
        }
    }
}

我从来没有从属性文件中读取问题但是很难写入文件。这个问题似乎已经通过指定

解决了
URL url = classLoader.getResource("config.properties");

现在,如果我将服务器名称从“localhost”更改为“192.168.1.1”,我可以看到即使刷新页面或重新启动服务器,新信息仍然存在。但是......当我打开config.properties文件时,我仍然看到

dbserver=localhost

当我期待看到

dbserver=192.168.1.1

即使文件仍然保持不变,信息似乎仍然存在于其他地方?我如何以及在哪里可以访问我的属性的内容,以查看对其进行的更改?

1 个答案:

答案 0 :(得分:0)

修改WAR文件是一个坏主意(例如,某些Web服务器可能会注意到文件修改和重新部署您的应用程序,当服务器在部署时爆炸时可能会出现问题等。)

我建议采用另一种方法 - 一些可能性是:

将属性放在数据库表中,以便轻松修改它们

使用外部属性文件覆盖“Property.prop”文件设置。你可以将其关闭,例如如下。假设您的WAR中捆绑了默认属性值,并且修改后的值保存到其他路径中,该路径是使用系统属性定义的 - 假设它叫做CONFIG_LOCATION。现在从bundle中加载你的属性后,你也可以从这个外部的“overrides.prop”文件中读取它们 - 这将覆盖你的默认值“Property.prop”:

    PropertiesConfiguration pc1=new PropertiesConfiguration(a); 
    try(
FileReader propReader = new FileReader(System.getenv().get("CONFIG_FILES") +"/overrides.prop"){ pc1.load(propReader); 
}

当您需要保存更改时,可以执行“overrides.prop” - 这将保存所有属性,不仅是已更改的属性,而且应该没有负面影响。