【问题标题】:How to reload a properties file on a jar如何在 jar 上重新加载属性文件
【发布时间】:2018-06-25 22:25:54
【问题描述】:

我有一个在 Eclipse 上开发的 java 应用程序,我想生成它的可执行 jar。首先,我发现 jar 无法管理输入到FileInputStream 的路由的问题,所以我决定将FileInputStream 更改为getClass().getResourceAsStream()。问题是我必须在执行时覆盖属性文件,但 getResourceStream() 没有正确重新加载,因为它必须在缓存中或其他东西中。我尝试了在这个论坛中找到的几种解决方案,但似乎都没有。

我使用 FileInputStream 加载属性的原始代码是:

private Properties propertiesLoaded;
private InputStream input;
this.propertiesLoaded = new Properties();
this.input = new FileInputStream("src/resources/config.properties");
propertiesLoaded.load(this.input);
this.input.close();

这似乎在 Eclipse 中完美运行,但在 jar 中却不行。我用这个论坛的信息尝试了这种方法:

this.propertiesLoaded = new Properties();
this.input = this.getClass().getResourceAsStream("/resources/config.properties");
propertiesLoaded.load(this.input);
this.input.close();

问题是当程序尝试更新属性文件时,它似乎没有正确地重新加载它。我可以看到该属性已被编辑,但再次读取时它返回旧值。覆盖属性的代码是:

private void saveSourceDirectory(String str) {
    try {
        this.input = this.getClass().getResourceAsStream("/resources/config.properties");
        propertiesLoaded.load(this.input);
        propertiesLoaded.setProperty("sourceDirectory", str);
        propertiesLoaded.store(new FileOutputStream("src/resources/config.properties"), null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我的问题是:

  • 在可执行 jar 中更新属性文件的正确方法是什么?
  • 如何强制我的程序重新加载属性文件中的内容?

【问题讨论】:

    标签: java jar fileinputstream


    【解决方案1】:

    对于您的第一个问题:您不应该这样做。一种常见的方法是在可执行 jar 中使用内置配置,并可选择将配置文件作为参数传递。将配置更改存储回 jar 不是一个好主意,因为这意味着修改正在运行的二进制文件。

    第二个问题:实现此类功能的常用方法是在配置文件中添加更改侦听器。这可以使用java.nio.file package 来完成: https://docs.oracle.com/javase/tutorial/essential/io/notification.html

    【讨论】:

    • 那么,在不使用数据库时,存储用户对应用程序设置所做的更改的正确方法是什么?我认为属性文件会是一个不错的解决方案,但你有点让我大开眼界
    • @Drubio 我会选择外部配置文件,尽管您在其他评论中说您不喜欢它。我不同意它不干净的想法 - 如果您使用外部文件,您可以更改代码但保留配置。否则,您会在每次部署时重置配置。
    【解决方案2】:

    我认为更新 jar(或 zip)内的文件的唯一方法是提取、修改和再次压缩它。可能你不能用一个正在运行的 jar 来做到这一点。

    当你这样做时:

    propertiesLoaded.store (new FileOutputStream ("src / resources / config.properties"), null);
    

    您可能会收到 FileNotFoundException,因为您无法使用 File API,就像您无法使用 FileInputStream 加载属性一样。

    可能最好的解决方案是将属性存储在 jar 之外的某个位置或使用 Java Preferenced API。

    相关:https://coderanch.com/t/616489/java/modify-Properties-file-JAR

    【讨论】:

    • 从可用性和干净的角度来看,为用户提供外部配置文件似乎是一个更糟糕的解决方案。顺便说一句,真的有用的链接。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多