我有一个连接数据库的简单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 但它不会返回我希望能够读取的位置。
我很感谢任何建议
答案 0 :(得分:2)
我将属性文件放置在同一文件夹中,以便用户可以轻松地编辑属性文件并根据自己的喜好更改连接设置
您面临的问题归结为以下事实:运行应用程序的工作目录可能与应用程序及其文件的存储位置不同。您不能依赖固定的位置。
相反,您应该采用平台的约定并将文件存储在“公共”位置(固定)。
在可能是...的窗口上
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,同时允许他们指定要使用的属性文件的位置。意味着他们可以根据那里的需求拥有更多的人