如何在Runnable JAR中存储和检索属性?

时间:2012-07-30 08:08:22

标签: java properties jar

我正在尝试使用Java类属性在执行之间保存应用程序的设置。之后我想将我的应用程序导出到可运行的JAR文件中,并保留这个文件中所需的所有内容以提供可移植性。因此,我的应用程序必须找到属性文件,加载它然后在退出时将新设置保存到其中。

装载工作正常:

Properties prop = new Properties().load(this.getClass().getResourceAsStream("properties.cfg"));

但是对于存储我需要找到相同的文件并覆盖它。方法Properties.store()需要一个OutputStream,但getResourceAsStream返回一个InputStream,因此我找不到该文件并访问它。

它应始终位于* .class文件中。我发现许多解决方案在导出到JAR之前有效但没有一个在导出后可以工作。感谢您的任何建议。

3 个答案:

答案 0 :(得分:8)

你不能重写你的jar(或者更确切地说,它很复杂并且不是一个好主意)。

一个更好的解决方案是从以下位置读取属性:

  1. 计算机上的目录
  2. .jar档案
  3. 最初,位置1没有属性文件,您将回退到.jar文件。当您编写属性时,您将它们写入指定目录,然后在下一次阅读时,您将从此位置读取属性。这将在重启后继续存在等。

    请注意,Apache Commons Configuration之类的库会自动支持这种分层属性定位机制,并且可以为您编写自己的解决方案节省一些时间/精力。

答案 1 :(得分:0)

对于这种情况,最好的方法是将属性文件添加到类路径并使用ResourceBundle之类的东西加载它。

private static ResourceBundle _properties = ResourceBundle.getBundle("sample.properties");
String sampleProperty = _properties.getString(propertyKey);

如何执行:

假设您的jar文件是MyJar.jar,属性文件名为sample.properties 那么你应该在它周围写一个批处理或sh文件

例如:run.sh

java -cp MyJar.jar:conf "Class with main Method"

答案 2 :(得分:0)

采用spring的IO架构(ClasspathResource)

try {
        ClassPathResource r = new ClassPathResource("bdd.properties");
        Properties properties = new Properties();
        properties.load(r.getInputStream());
    } catch (IOException e) {
        Throwables.propagate(e);
    }

这是真正的简化。