UCanAccess Access 数据库文件的相对路径

UCanAccess relative path to Access database file

我为自己编写了一个使用 Access 数据库文件的简单程序。 我使用绝对路径连接到数据库:

String path = "jdbc:ucanaccess://D:/Development/20_Eclipse/Budget/data/Budget.accdb";
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        this.conn = DriverManager.getConnection(path);

当我在其他地方使用可运行的 jar 时,这条路径(可以理解)不起作用。所以我尝试了相对路径,但它们也没有用。

然后我尝试使用

构建路径
String path = "jdbc:ucanaccess://" + helper.programmPathForDB() + "/data/Budget.accdb";

其中 helper.programPathForDB() 这样做:

public String programmPathForDB()
{
    String tempPath = this.getClass().getResource( "." ).toString();
    String path = tempPath.substring(6, (tempPath.length()-12));

    return path;
}

这仅在我通过 IDE (Eclipse) 启动程序时有效。当我在其他地方启动 jar 时它不起作用。

我该如何解决这个问题?

听起来您想将数据库文件放在与 JAR 文件位置相关的文件夹中(例如,子文件夹)。如果是,那么

Get location of JAR file

就如何确定 JAR 文件的位置提供了一些建议。

但是,您应该记住,将数据库文件放在那里可能不是一个好主意。根据应用程序的部署方式,这样的位置可能会拒绝没有提升权限的用户的写入访问权限(例如,Windows 下的 %ProgramFiles%)。此外,移动 JAR 文件而不移动数据库文件可能会破坏您的应用程序。

所有现代操作系统都提供众所周知且可发现的位置,应用程序可以在其中安全地放置 "stuff" 不是(可执行)应用程序本身的组成部分。例如,Windows 为用户特定位置提供 %APPDATA%%LOCALAPPDATA%,同时为需要在所有用户之间共享的资源提供 %PUBLIC%。您应该考虑将这些位置之一(的子文件夹)用于您的数据库文件。

因此,在上面 Gord Thompson 的帮助下,我通过在 APPDATA 下部署数据库并使用环境变量 + 我的项目路径解决了这个问题:

String path = "jdbc:ucanaccess://" + System.getenv("APPDATA") + "/Budget/data/Budget.accdb";

UCanAccess 连接 URL 必须始终以 jdbc:ucanaccess:// 开头,后跟数据库文件的路径。

对于相对路径(例如,src/main/resources/testDB.accdb),将是

jdbc:ucanaccess://src/main/resources/testDB.accdb