2013-05-19 44 views
7

我寫了一個小應用程序。我已將特定於數據庫的信息放入屬性文件中。包含帶有Jar文件的屬性文件

db.url=jdbc:mysql://localhost:3306/librarydb 
db.user=root 
db.passwd=pas$w0rd 

當我構建應用程序來獲取可執行jar文件時,屬性文件被包含在裏面。把這些信息放在一個屬性文件中的目的是爲了讓用戶改變這些信息,但這使得它變得不可能。

如何在jar文件中不包含屬性文件?有點像在.NET應用程序中使用AppSettings文件。

我對Java非常陌生,所以如果能將它分解爲一組步驟,我會很感激。

謝謝。

編輯:

這是我應得的值從屬性在我的程序文件。

public class DatabaseHandler { 

    public static Connection connectToDb() { 
     Connection con = null; 
     Properties props = new Properties(); 
     InputStream in = null; 

     try { 
      in = DatabaseHandler.class.getResourceAsStream("database.properties"); 
      props.load(in); 
      in.close(); 

      String url = props.getProperty("db.url"); 
      String user = props.getProperty("db.user"); 
      String password = props.getProperty("db.passwd"); 

      con = DriverManager.getConnection(url, user, password); 
     } catch (Exception ex) {   
      Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
      return con; 
    } 

} 
+0

這不是我清楚你的意思是什麼「我怎麼能包括的屬性有沒有在它的jar文件文件」 - 只是不把屬性文件放在jar文件中...... –

+0

嗯......我能給出的最接近的例子是.NET中的App.config文件。當可執行文件被創建時,文件與它捆綁在一起,對吧?不在裏面。 – Isuru

+0

當然。所以現在你已經提供了代碼,我們可以看到你需要做什麼 - 只需使用'FileInputStream'而不是'getResourceAsStream'。 –

回答

0

不要硬編碼屬性文件的位置。你的方法應該是從classpath中傳輸文件。

如果不是,最好的方法是指向一個URL,它以特定的數據格式(比如JSON)返回屬性信息。

如果你有JAR檢查this出來。

如果您的應用程序是WAR檢查properties in WAR

2

您可以改爲從類路徑加載屬性文件。這使您可以捆綁jar中的屬性文件,而且還可以在之外的罐子中。它只需要在正在運行的應用程序的類路徑上。

您可以通過以下方式做到這一點:

Properties props = new Properties(); 
InputStream inputStream = this.getClass().getClassLoader() 
     .getResourceAsStream(propFileName); 

props.load(inputStream); 
+0

因此,如果我只是把屬性文件放在可執行jar文件所在的文件夾中,它會工作嗎? (我也編輯了這個問題,把我用來檢索屬性文件中的值的代碼) – Isuru

6

你是對的。如果屬性旨在爲用戶修改,然後把它們放在一個屬性的JAR文件是行不通的

有幾個辦法:

  • 你可以把屬性在您存儲在文件系統中的屬性文件中。問題是找出其中在文件系統中存儲它們:

    • 在Unix/Linux存在用於在哪裏存儲系統範圍和每用戶配置屬性約定,但這些都有點鬆動,並在一個不活躍的狀態(例如,某些「桌面」框架有自己的偏好機制。

    • 我相信Windows也有類似的約定。

    • 方法的問題可能是權限問題(您不希望一個用戶更改其他用戶的首選項),甚至可能出現只讀文件系統等問題。

    • 如果您要在文件系統中使用屬性文件,將位置硬連線到您的代碼中是一個壞主意。通過命令行參數和/或可以使用-D選項設置的「系統屬性」進行配置。

  • 在Windows上,您可以將屬性放到Windows註冊表中。但是你需要使用第三方庫來做到這一點。當然,這不是便攜式的 - 它不適用於非Windows平臺。您可以使用Java Preferences API。這是跨多個平臺移植的,但它是以Java爲中心的解決方案;即它不適合平臺的做法「正常方式」。

簡而言之,從各個角度都沒有理想的解決方案。


但是,一旦你決定如何存儲你的喜好,你可以您的應用程序,以便它使用的屬性在你的JAR文件的文件提供默認或初始設置。的

2

代替

in = DatabaseHandler.class.getResourceAsStream("database.properties"); 

嘗試

in = DatabaseHandler.class.getResourceAsStream("/database.properties"); 
相關問題