【问题标题】:Include A Properties File With A Jar File包含带有 Jar 文件的属性文件
【发布时间】:2013-05-13 23:55:52
【问题描述】:

我写了一个小应用程序。我已将数据库特定信息放在属性文件中。

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 文件的属性文件” - 只是不要将属性文件放在 jar 文件中......
  • 嗯...我能给出的最接近的例子是 .NET 中的 App.config 文件。创建可执行文件时,文件与它捆绑在一起,对吗?不在里面它。
  • 当然。所以现在您已经提供了代码,我们可以看到您需要做什么 - 只需使用 FileInputStream 而不是 getResourceAsStream
  • 嗨,Isuru,我正在寻找相同的信息。您能否分享一些关于我应该将properties 文件放在哪里的信息?我应该使用FileInputStream 还是getResourceAsStream
  • @Shruti 嗨。不幸的是,我在两年前从事大学项目时问了这个问题。我现在什么都不记得了。而且我不再是 Java 开发人员了。如果您可以向在下面发布答案的人提问,那就更好了。或者完全发布一个单独的问题。对不起。

标签: java database executable-jar properties-file


【解决方案1】:

你是对的。如果属性打算由用户修改,那么将它们放在 JAR 中的属性文件中是行不通的

有几种方法:

  • 您可以将属性放在存储在文件系统中的属性文件中。问题在于找出文件系统中的 何处 来存储它们:

    • 在 UNIX / Linux 上,存在存储系统范围和每个用户配置属性的约定,但这些约定有点松散,并且处于不稳定状态(例如某些“桌面”框架有自己的偏好机制。

    • 我相信 Windows 也有类似的约定。

    • 方法的问题可能是权限问题(您不希望一个用户更改另一个用户的首选项),甚至可能是只读文件系统等问题。

    • 如果要在文件系统中使用属性文件,将位置硬连接到代码中是个坏主意。通过命令行参数和/或可以使用-D 选项设置的“系统属性”使其可配置。

  • 在 Windows 上,您可以将属性放入 Windows 注册表。但是您需要使用 3rd 方库来执行此操作。当然,这是不可移植的 - 它不能在非 Windows 平台上运行。

  • 您可以使用Java Preferences API。这可以跨多个平台移植,但它是一个以 Java 为中心的解决方案;即它不适合平台的“正常方式”做事。

简而言之,没有从所有角度来看都是理想的解决方案。


但是,一旦您决定了如何存储您的首选项,您可以编写您的应用程序,以便它使用 JAR 文件中的属性文件来提供默认或初始设置。

【讨论】:

    【解决方案2】:

    您可以改为从类路径加载属性文件。这使您可以将属性文件捆绑在 jar 内,也可以在 jar 外部。它只需要在正在运行的应用程序的类路径上。

    您可以通过以下方式这样做:

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

    【讨论】:

    • 所以如果我只是将属性文件放在可执行jar文件所在的同一文件夹中,它会工作吗? (我还编辑了问题以放置我用来从属性文件中检索值的代码)
    【解决方案3】:

    而不是

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

    试试

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

    【讨论】:

      【解决方案4】:

      不要硬编码属性文件的位置。您的方法应该是从类路径流式传输文件。

      如果不是,更好的方法是指向一个以特定数据格式(例如 JSON)返回属性信息的 URL。

      如果您有 JAR,请检查 this

      如果您的应用程序是 WAR,请检查 properties in WAR

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-08
        • 2013-11-14
        • 2014-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 2014-12-20
        相关资源
        最近更新 更多