我有一个结构简单的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 :(得分:27)
处理此问题的典型方法是从嵌入式文件加载基本属性,并允许应用程序的用户指定包含替代的其他文件。一些伪代码:
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"
答案 1 :(得分:3)
首先保留属性文件中的默认属性,该属性将打包到jar中。当应用程序启动尝试从文件系统中的某个默认位置读取相同的命名属性文件时,首选您可以通过System.getProperty("user.home");
获取的用户主文件夹。如果文件系统中存在该文件,则加载它,如果它不存在,则加载打包属性文件并将副本写入文件系统。
因此,如果您的属性文件名是myprops.properties
,那么最初只有您的jar文件将包含它。当应用程序启动时,它将检查/home/xyz/myprops.properties
文件是否存在。由于它没有,它将读取打包属性文件并将副本写入/home/xyz/myprops.properties
文件。从下一次开始,它将从/home/xyz/myprops.properties
读取。
答案 2 :(得分:2)
为什么不将属性文件的位置作为命令行参数传递(在标志之后)?如果它不存在,那么使用jar文件中的默认值。
答案 3 :(得分:-1)
您正在从类路径加载属性文件。我建议这样的事情: