包含一个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; } } 

你是对的。 如果属性可由用户修改,那么将它们放在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"); 

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

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

如果你有JAR,请检查一下。

如果您的应用程序是WAR中的WAR检查属性 。