簡體   English   中英

如何在Runnable JAR中存儲和檢索屬性?

[英]How do I store and retrieve Properties inside Runnable JAR?

我正在嘗試使用Java類屬性在執行之間保存應用程序的設置。 之后我想將我的應用程序導出到可運行的JAR文件中,並保留這個文件中所需的所有內容以提供可移植性。 所以我的應用程序必須找到屬性文件,加載它然后在退出時將新設置保存到其中。

裝載工作正常:

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

但是對於存儲,我需要找到相同的文件並覆蓋它。 方法Properties.store()需要一個OutputStream,但getResourceAsStream返回一個InputStream,因此我找不到該文件並訪問它。

它應始終位於* .class文件中。 我發現許多解決方案在導出到JAR之前有效但沒有一個在導出后可以工作。 謝謝你的任何建議。

你不能重寫你的jar(或者更確切地說,它很復雜並且不是一個好主意)。

一個更好的解決方案是從以下位置讀取屬性:

  1. 您計算機上的目錄
  2. .jar文件

最初,位置1沒有屬性文件,您將回退到.jar文件。 當您編寫屬性時,您將它們寫入指定目錄,然后在下一次閱讀時,您將從此位置讀取屬性。 重啟等等。

請注意,諸如Apache Commons Configuration之類的庫會自動支持這種分層屬性定位機制,並且可以為您編寫自己的解決方案節省一些時間/精力。

對於這種情況,最好的方法是將屬性文件添加到類路徑並使用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"

采用spring的IO基礎結構(ClasspathResource)

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

這是真正的簡化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM