2012-02-05 52 views
18

我有簡單的Java項目與結構:困惑Java屬性文件位置

package com.abc: a.java b.java c.properties

我在c.properties文件配置的數據庫配置參數。 內a.java和b.java,我加載屬性文件使用:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

這工作得很好。但主要問題是,一旦我通過導出此代碼來準備可執行文件jar,屬性文件也會被打包成jar文件。如果有人想修改不同數據庫配置的屬性文件,他怎麼能做到這一點? 我是否必須將屬性文件存儲在本地機器的某個固定位置。例如「C:/」。然後將jar和屬性文件一起給予另一個人。那麼他需要複製C:/ location中的屬性文件? 還有一個問題,我怎樣才能使這個位置通用的Windows和Linux機器?

+0

可能重複[加載文件外部到分佈罐](http://stackoverflow.com/questions/9142571/load-files-external-to-the-distribution-jar) – 2012-02-05 16:46:03

回答

21

處理此問題的典型方法是從嵌入文件加載基本屬性,並允許應用程序的用戶使用覆蓋指定其他文件。一些僞代碼:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

String externalFileName = System.getProperty("app.properties"); 
InputStream fin = new FileInputStream(new File(externalFileName)); 
p.load(fin); 

你的程序將調用與此類似:

java -jar app.jar -Dapp.properties="/path/to/custom/app.properties" 
+0

這似乎是一個完美的解決方案。我一定會嘗試這個。謝謝。 – user613114 2012-02-05 17:02:30

+0

您也可以讓用戶在jar文件之前將一個文件放在jar文件中,該文件的目錄也位於類路徑中。在這種情況下,目錄中的文件將取代jar文件中的文件。 – 2012-02-05 17:09:24

2

爲什麼不傳遞屬性文件的位置作爲命令行參數(在一個標誌後面)?如果它不存在,則使用jar文件中的默認值。

3

首先保持默認的屬性在你的屬性文件,它被裝進罐子裏。當應用程序啓動時,嘗試從文件系統中的某個默認位置讀取同一個命名屬性文件,最好是用戶的主文件夾,您可以通過System.getProperty("user.home");獲取該文件夾。如果文件存在於文件系統中,如果文件不存在,則加載打包的屬性文件並將副本寫入文件系統。

所以如果你的屬性文件名是myprops.properties,最初只有你的jar文件將包含它。當應用程序啓動時,它將檢查是否存在/home/xyz/myprops.properties文件。由於沒有,它會讀取打包的屬性文件並將一個副本寫入/home/xyz/myprops.properties文件。從下一次起,它將從/home/xyz/myprops.properties中讀取。

+0

並且用戶所做的所有更改都應寫入/home/xyz/myprops.properties文件 – 2012-02-05 16:55:46