对 java 属性文件位置感到困惑

2022-09-01 15:51:39

我有一个简单的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机器?


答案 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"

答案 2

首先将默认属性保留在属性文件中,该文件将打包到 jar 中。当应用程序开始时,请尝试从文件系统中的某个默认位置读取相同的命名属性文件,最好是用户的主文件夹,您可以通过 .如果文件存在于文件系统中,则加载它,如果它不存在,则加载打包的属性文件并将副本写入文件系统。System.getProperty("user.home");

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