2012-07-30 60 views
4

我想使用Java類屬性來保存我的應用程序在執行之間的設置。之後,我想將我的應用程序導出到可運行的JAR文件中,並將這一個文件中所需的所有內容都提供給可移植性。所以我的應用程序必須找到屬性文件,加載它,然後在退出時保存新的設置。如何在Runnable JAR內部存儲和檢索屬性?

裝載工作正常:

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

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

它應該總是位於* .class文件中。我發現許多解決方案在導出到JAR之前工作,但在導出後沒有任何解決方案。感謝您的任何建議。

回答

8

你不能重寫你的jar(或者說,它很複雜,而不是一個好主意)。

優選的解決辦法是讀屬性:你的機器

  • .jar文件上

    1. 目錄

    最初位置1不會有一個屬性文件,你'd回落到您的.jar文件。當您編寫屬性時,您會將它們寫入指定的目錄,然後在下一次讀取時,您會從此位置讀取屬性。這可以在重新啓動等情況下倖存下來。

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

  • +1

    這實際上是一個非常簡單和簡單的解決方案。我不敢相信我沒有弄清楚這一點。謝謝。 – user1562293 2012-07-30 08:16:47

    +0

    非常好。 Thx的反饋 – 2012-07-30 08:18:36

    +1

    @ user1562293不要忘了接受的答案解決您的問題[見](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235# 5235) – Dinushan 2012-07-30 08:22:18

    0

    爲這種情況的最好方法是增加屬性文件到classpath,並使用類似的ResourceBundle加載它。

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

    如何執行:

    假設你的jar文件是MyJar.jar和財產文件被稱爲sample.properties 則u應該寫它周圍

    例如批處理或SH文件:運行的.sh

    java -cp MyJar.jar:conf "Class with main Method" 
    
    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); 
        } 
    

    這是真正的簡化。