2012-02-05 48 views
18

我有简单的Java项目与结构:困惑Java属性文件位置

package com.abc: a.java b.java c.properties

我在c.properties文件配置的数据库配置参数。 内a.java和b.java,我加载属性文件使用:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

这工作得很好。但主要问题是,一旦我通过导出此代码来准备可执行文件jar,属性文件也会被打包成jar文件。如果有人想修改不同数据库配置的属性文件,他怎么能做到这一点? 我是否必须将属性文件存储在本地机器的某个固定位置。例如“C:/”。然后将jar和属性文件一起给予另一个人。那么他需要复制C:/ location中的属性文件? 还有一个问题,我怎样才能使这个位置通用的Windows和Linux机器?

+0

可能重复[加载文件外部到分布罐](http://stackoverflow.com/questions/9142571/load-files-external-to-the-distribution-jar) – 2012-02-05 16:46:03

回答

21

处理此问题的典型方法是从嵌入文件加载基本属性,并允许应用程序的用户使用覆盖指定其他文件。一些伪代码:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

String externalFileName = System.getProperty("app.properties"); 
InputStream fin = new FileInputStream(new File(externalFileName)); 
p.load(fin); 

你的程序将调用与此类似:

java -jar app.jar -Dapp.properties="/path/to/custom/app.properties" 
+0

这似乎是一个完美的解决方案。我一定会尝试这个。谢谢。 – user613114 2012-02-05 17:02:30

+0

您也可以让用户在jar文件之前将一个文件放在jar文件中,该文件的目录也位于类路径中。在这种情况下,目录中的文件将取代jar文件中的文件。 – 2012-02-05 17:09:24

2

为什么不传递属性文件的位置作为命令行参数(在一个标志后面)?如果它不存在,则使用jar文件中的默认值。

3

首先保持默认的属性在你的属性文件,它被装进罐子里。当应用程序启动时,尝试从文件系统中的某个默认位置读取同一个命名属性文件,最好是用户的主文件夹,您可以通过System.getProperty("user.home");获取该文件夹。如果文件存在于文件系统中,如果文件不存在,则加载打包的属性文件并将副本写入文件系统。

所以如果你的属性文件名是myprops.properties,最初只有你的jar文件将包含它。当应用程序启动时,它将检查是否存在/home/xyz/myprops.properties文件。由于没有,它会读取打包的属性文件并将一个副本写入/home/xyz/myprops.properties文件。从下一次起,它将从/home/xyz/myprops.properties中读取。

+0

并且用户所做的所有更改都应写入/home/xyz/myprops.properties文件 – 2012-02-05 16:55:46