有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

装载工作正常:

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

但是为了存储,我需要找到相同的文件并覆盖它。方法属性。store()需要一个OutputStream,但getResourceAsStream返回一个InputStream,因此我无法找到该文件并访问它

它应始终与*一起放置。类文件。我发现很多解决方案在导出到JAR之前可以工作,但在导出之后没有一个可以工作。谢谢你的建议


共 (3) 个答案

  1. # 1 楼答案

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

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

    1. 计算机上的目录
    2. .jar文件

    最初位置1没有属性文件,您将返回到.jar文件。当您写入属性时,您会将它们写入指定目录,然后在下次读取时,您会从该位置读取属性。这将在重启等情况下仍然有效

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

  2. # 2 楼答案

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

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

    如何执行:

    假设您的jar文件是MyJar。jar和属性文件称为sample。性质 然后你应该在它周围写一个批处理或sh文件

    跑步。嘘

    java -cp MyJar.jar:conf "Class with main Method"
    
  3. # 3 楼答案

    以spring的IO基础架构(ClasspathResource)为例

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

    这是真正的简化