繁体   English   中英

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

[英]Set a Path for database file in java

我正在开发一个使用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

最好的选择是外部化数据库路径,而不是对其进行硬编码,然后让用户选择将实际sqlite文件放在何处。

您可以将sqlite文件与程序归档文件放在同一目录中,但是请注意,这实际上并不能帮助您从代码中查找文件,因为相对路径绝对是根据JVM(进程)工作目录而不是位置来解析的JAR:

new File(".").getAbsolutePath()

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

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

但是它们是依赖于部署的,因此这不是一个非常可靠的策略。

大多数Java程序都配置有放置在已知位置的外部文件(例如,当前JVM目录或用户主目录中的.myapp/conf.properties ),并且可以在启动命令行中覆盖单个属性,作为系统属性之一-Dkey=value或程序参数(有一个库可简化此操作)

当您不指定绝对路径时,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());

这在另一篇SO帖子中得到了展示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM