我写了一个小应用程序。我已将数据库特定信息放在属性文件中。
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 :(得分:6)
你是对的。如果属性可由用户修改,那么将它们放在JAR中的属性文件中是行不通的
有几种方法:
您可以将属性放在存储在文件系统中的属性文件中。问题是在文件系统中找出 where 来存储它们:
在UNIX / Linux上,存在用于存储系统范围和每用户配置属性的约定,但这些属性有点松散,并且处于一种不稳定状态(例如某些“桌面”框架)有自己的偏好机制。
我认为Windows有类似的约定。
方法的问题可能是权限问题(您不希望一个用户更改另一个用户的首选项),甚至可能出现只读文件系统等问题。
如果要在文件系统中使用属性文件,将位置硬连接到代码中是个坏主意。通过命令行参数和/或可以使用-D
选项设置的“系统属性”进行配置。
在Windows上,您可以将属性放入Windows注册表中。但是您需要使用第三方库来执行此操作。当然,这是不可移植的 - 它不适用于非Windows平台。
您可以使用Java Preferences API。这可以跨多个平台移植,但它是一个以Java为中心的解决方案;也就是说,它不适合平台的“常规做法”。
简而言之,从各方面来看都没有理想的解决方案。
但是,一旦您决定如何存储首选项,就可以编写您的应用程序,以便它使用JAR文件中的属性文件来提供默认或初始设置。
答案 1 :(得分:2)
您可以从类路径加载属性文件。这使您可以将属性文件捆绑在jar中,但也可以
您可以通过以下方式执行此操作:
Properties props = new Properties();
InputStream inputStream = this.getClass().getClassLoader()
.getResourceAsStream(propFileName);
props.load(inputStream);
答案 2 :(得分:2)
而不是
in = DatabaseHandler.class.getResourceAsStream("database.properties");
尝试
in = DatabaseHandler.class.getResourceAsStream("/database.properties");
答案 3 :(得分:0)
不要硬编码属性文件的位置。您的方法应该是从类路径流式传输文件。
如果没有,更好的方法是指向一个以特定数据格式(比如JSON)返回属性信息的URL。
如果您有JAR,请检查this。
如果您的申请是WAR检查properties in WAR。