在java中设置数据库文件的路径

时间:2013-12-29 15:24:41

标签: java sqlite jar

我正在开发一个使用sqlite文件作为数据库的程序。当我编译和测试我的程序时,我没有任何问题:

Conection c = DriverManager.getConnection(
                    "jdbc:sqlite:/home/mehdi/my_database.sqite");

如上所示,代码显示了设置为数据库文件的直接路径(此路径仅在我的系统中)。 所以它工作正常,但我的问题开始于我创建程序的可执行jar文件,如果我创建可执行jar文件并与其他用户共享,当他们运行可执行jar时它不起作用。

我的第一个问题:如何在我的代码中为可执行jar文件设置数据库路径? 我的第二个问题:数据库是否可能与可执行jar一起? (我可以用我的数据库移动我的可执行jar文件)

some_path/my_program_file.jar
some_path/my_database.sqite

2 个答案:

答案 0 :(得分:2)

最好的选择是外部化数据库路径而不是硬编码,并让用户选择放置实际sqlite文件的位置。

您可以将sqlite文件放在与程序存档相同的目录中,但请注意,这无法帮助您从代码中找到文件,因为相对路径肯定是针对JVM(进程)工作目录解决的,而不是JAR的位置:

new File(".").getAbsolutePath()

有多种方法可以获取JAR的位置:

getClass().getProtectionDomain().getCodeSource().getLocation()

但它们依赖于部署,所以它不是一个非常强大的依赖策略。

大多数Java程序都配置了外部文件,这些文件放在众所周知的位置(比如当前的JVM目录或用户主目录中的.myapp/conf.properties),并且可以在起始命令行中覆盖各个属性,因为系统属性-Dkey=value或程序参数(有a library来简化这一点)

答案 1 :(得分:1)

当您未指定绝对路径时,Java会使用相对路径。我不确定它是否适用于DriverManager。这意味着如果你调用jdbc:sqlite:my_database.sqite,它应该在执行jar的文件夹中查找my_database.sqite。因此,如果用户从数据库所在的文件夹中调用java -jar my_program_file.jar,它将起作用。如果用户从另一个位置调用jar,则不会。要解决这个问题,你必须抓住jar所在的路径,如下所示:

return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());

This was showcased in another SO post