对java属性文件位置感到困惑
Posted
技术标签:
【中文标题】对java属性文件位置感到困惑【英文标题】:Confused about java properties file location 【发布时间】:2012-02-27 09:20:57 【问题描述】:我有一个结构简单的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:/ 位置复制属性文件? 还有一个问题,我怎样才能使这个位置对 windows 和 linux 机器通用?
【问题讨论】:
Load files External To The Distribution Jar的可能重复 【参考方案1】:处理此问题的典型方法是从您的嵌入文件加载基本属性,并允许应用程序的用户指定具有覆盖的附加文件。一些伪代码:
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"
【讨论】:
这似乎是完美的解决方案。我一定会试试这个。谢谢。 您还可以让用户将与 jar 文件中的名称和路径相同的文件放在 jar 之前的目录中,该目录也位于类路径中。在这种情况下,目录中的文件将取代 jar 文件中的文件。【参考方案2】:首先将默认属性保留在您的属性文件中,该文件将被打包到 jar 中。当应用程序开始尝试从文件系统中的某个默认位置读取相同命名的属性文件时,最好使用用户的主文件夹,您可以通过System.getProperty("user.home");
获取该文件夹。如果文件存在于文件系统中,则加载它,如果它不存在,则加载打包的属性文件并将副本写入文件系统。
因此,如果您的属性文件名为myprops.properties
,最初只有您的 jar 文件会包含它。当应用程序启动时,它会检查/home/xyz/myprops.properties
文件是否存在。由于没有,它将读取打包的属性文件并将副本写入/home/xyz/myprops.properties
文件。从下一次开始,它将从/home/xyz/myprops.properties
读取。
【讨论】:
并且用户所做的所有更改都应该写入 /home/xyz/myprops.properties 文件【参考方案3】:为什么不将属性文件的位置作为命令行参数(在标志之后)传递?如果不存在,则使用 jar 文件中的默认值。
【讨论】:
【参考方案4】:您正在从类路径加载属性文件。我会建议这样的事情:
Properties location
【讨论】:
以上是关于对java属性文件位置感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
对用于反向地理编码位置的 CLGeocoder 类方法感到困惑