对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机器?

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

 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中。 当应用程序启动尝试从文件系统中的某个默认位置读取相同的命名属性文件时,首选可以通过System.getProperty("user.home");获取的用户主文件夹System.getProperty("user.home"); 。 如果文件系统中存在该文件,则加载它,如果它不存在,则加载打包属性文件并将副本写入文件系统。

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

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

您正在从类路径加载属性文件。 我建议这样的事情:

属性位置