【问题标题】:java- reading the properties file outside of jar filejava-读取jar文件之外的属性文件
【发布时间】:2019-04-23 14:58:19
【问题描述】:

我有一个连接到数据库的简单 Java 程序。连接在db.properties 文件中配置。我的程序运行良好。

当我想将它编译成可执行的 jar 文件时,我会将属性文件放在同一个文件夹中,以便用户可以轻松地编辑属性文件并根据自己的喜好更改连接设置。这里的小问题是我的dbpath,我必须指定确切的目录来读取属性文件。

我想知道我是否可以将其保存在同一个文件夹中并将路径设置为当前目录,这样无论用户将文件夹保存在何处,它都将始终能够读取 db 属性而无需对路径进行硬编码。

代码:

 Properties props=new Properties();
                String dbpath = "C:\\Users\\nickywan123\\Documents\\db.properties";
                FileInputStream in = new FileInputStream(dbpath);

             props.load(in);
             in.close();

             String driver = props.getProperty("jdbc.driver");
             if(driver!=null){
              Class.forName(driver);

                }

                String url=props.getProperty("jdbc.url");
                String username=props.getProperty("jdbc.username");
                String password=props.getProperty("jdbc.password");

                Connection con = DriverManager.getConnection(url,username,password);

我尝试了不同的解决方案来获取 jar 文件的位置,例如 Get location of JAR file 但它不会返回我希望能够读取的位置。

感谢任何建议

【问题讨论】:

  • 将文件放入 src/main/Resources 文件夹并将其放入您的 jar - 查看我提供的链接
  • 你应该为依赖文件使用相对路径。例如/resources/db.properties。在这种情况下,资源文件夹应该与当前工作目录平行。
  • @ScaryWombat 所以我必须在包含 jar 文件的文件夹中包含该文件夹以及该文件,对吗?
  • 如果您希望能够编辑文件,那么您需要将其存储在磁盘上(外部)。在这种情况下,最好将其存储在“众所周知”的位置。在可能类似于System.getProperty("user.dir") + File.seperator + "AppData/{Appname}/{foldername}/{file}" 的窗口上。这样做的原因是因为工作目录可能与安装 jar/文件的位置不同

标签: java


【解决方案1】:

我会将属性文件放在同一个文件夹中,以便用户可以轻松地编辑属性文件并根据自己的喜好更改连接设置

您面临的问题归结为这样一个事实,即运行应用程序的工作目录可能与存储应用程序及其文件的位置不同。您不能依赖已修复的位置。

相反,您应该采用平台的约定并将文件存储在“通用”位置(这是固定的)。

在可能...的窗口上

System.getProperty("user.dir") + "/AppData/{App name}/{folder name}/{file}"

在 MacOS 上可能...

System.getProperty("user.dir") + "/Library/Application Support/{App name}/{folder name}/{file}"

在 Linux 上可能...

System.getProperty("user.dir") + ".{Appname}/{folder name}/file"

这样呢,jar 文件和属性文件应该在同一个文件夹中。然后用户可以决定他们想要存储/保留文件夹的位置,这是最好的解决方案?

没关系,你仍然冒着“工作目录”与“安装目录”不同的风险,这就是开发上述解决方案的“原因”——这不仅仅是一个 Java 问题,而是影响所有程序

您还可能会遇到操作系统权限问题...看看您的 Windows ?

“另一个”解决方案是允许用户通过命令行传入文件/位置,允许他们从任何地方运行 Jar,同时允许他们指定他们想要使用的属性文件的位置...这意味着他们可以根据需要拥有更多

【讨论】:

  • 感谢您的回复,所以如果您将文件存储在一个公共位置,那不会是一个问题,因为用户可能希望将 jar 文件与属性文件一起存储,比如在他的自己的文件夹。他只是想修改属性文件并运行 jar 文件,以便反映更改。?
  • 这就是重点 - jar 和属性文件是相互独立的,因此 jar 的安装位置(可能与其运行位置不同)不会影响您的能力找到文件。另一种解决方案是允许用户指定文件然后自己,也许将其作为命令行参数传递
  • 这个怎么样,jar文件和properties文件应该在同一个FOLDER。然后用户可以决定他们想要存储/保留文件夹的位置,这是最好的解决方案?
  • 没关系,你仍然冒着“工作目录”与“安装目录”不同的风险,这就是开发上述解决方案的“原因”——这不仅仅是一个Java问题,但会影响所有程序
  • 所以将文件属性保存在与 jar 文件不同的位置,对吗?
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2017-06-04
  • 2010-10-20
相关资源
最近更新 更多