簡體   English   中英

包含一個Jar文件的屬性文件

[英]Include A Properties File With A Jar File

我寫了一個小應用程序。 我已將數據庫特定信息放在屬性文件中。

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;
    }

}

你是對的。 如果屬性可由用戶修改,那么將它們放在JAR中的屬性文件中是行不通的

有幾種方法:

  • 您可以將屬性放在存儲在文件系統中的屬性文件中。 問題是搞清楚在文件系統來存儲它們:

    • 在UNIX / Linux上,存在用於存儲系統范圍和每用戶配置屬性的約定,但這些屬性有點松散,並且處於一種不穩定的狀態(例如,某些“桌面”框架具有其自己的偏好機制。

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

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

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

  • 在Windows上,您可以將屬性放入Windows注冊表中。 但是您需要使用第三方庫來執行此操作。 當然, 這不是便攜式的 - 它不適用於非Windows平台。

  • 您可以使用Java Preferences API 這可以跨多個平台移植,但它是一個以Java為中心的解決方案; 即它不適合平台的“常規方式”做事。

簡而言之,從各個方面來看都沒有理想的解決方案。


但是,一旦確定了如何存儲首選項, 就可以編寫應用程序,以便它使用JAR文件中的屬性文件來提供默認或初始設置。

您可以從類路徑加載屬性文件。 這使您可以將屬性文件捆綁在jar中,也可以在jar 外部 它只需要在正在運行的應用程序的類路徑上。

您可以通過以下方式執行此操作:

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

props.load(inputStream);

代替

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

嘗試

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

不要硬編碼屬性文件的位置。 您的方法應該是從類路徑流式傳輸文件。

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

如果你有JAR檢查出。

如果您的應用程序是WAR中的WAR檢查屬性

暫無
暫無

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

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