如何将 SQLite 数据库包含在可执行 Jar 中?

2022-09-01 11:49:14

我创建了一个使用 SQLite 作为本地数据库的 Swing 应用程序。数据库文件位于项目的根目录中。

Project/DatabaseFile

该应用程序在Eclipse上运行良好,但是当我运行打包的可执行Jar时,我收到以下错误:

No such table : table1

这意味着数据库不可访问。当我检查生成的 JAR 文件的内容时,数据库文件已不存在。

在代码中,我按如下方式链接了数据库:

jdbc:sqlite:DatabaseFile

我的问题是,如何将SQLite数据库包含在可执行Jar中?

编辑

当我将 DB 文件放在源文件夹中并将路径更改为 时,它在 Eclipse 上工作正常,但在将 Jar 文件作为 运行时再次工作。它说:Project/src/DatabaseFilejdbc:sqlite:src/DatabaseFilejava -jar Project.jar

path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist

我认为我需要为数据库指定一个相对路径。

编辑

以下是我连接到数据库的方式:

public Connection getConnection(){      
    try{
        Class.forName("org.sqlite.JDBC").newInstance();             
        con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");              

    } catch (Exception e) {
        Log.fatal("Méthode: getConnection() | Class  : SQLiteConnection | msg system : " + e.getMessage());
    }
    return con;
}

答案 1

您在 SQLite 中使用了哪个库?

我根据您指示的连接URI进行了搜索,并找到了这个。在文档中,它说:

2009 年 5 月 19 日:sqlite-jdbc-3.6.14.1 发布。此版本支持“jdbc:sqlite::resource:”语法来访问JAR存档中包含的只读数据库文件,或通过URL,本地文件地址等指定的外部资源(另请参阅详细信息)。)

如果这是您正在使用的驱动程序,那么我建议使用以下连接URI:

"jdbc:sqlite::resource:DatabaseFile"

关键是,由于您的数据库位于 jar 文件中,因此无法将其作为 .相反,它必须通过JVM对它的支持(即Class.getResource()或Class.getResourceAsStream())来访问。请注意,jar 文件中包含的资源是只读的。您将无法保存对数据库所做的任何更改。FileInputStream


答案 2

我找到了两种不同的方法来命名文件路径,具体取决于您尝试访问它的方式。假设您正在访问的数据库位于/yourproject/resource/或/yourproject/bin/resource(尚未缩小范围,我的数据库位于两者中,我对此感到满意),您应该将其用作您的路径:

//Eclipse test path
String url = "jdbc:sqlite:resource/mydb.db";

//runnable jar path
String url = "jdbc:sqlite::resource:mydb.db";

然后

mysqlitedatasource.setUrl(url);

你的方式也有效...通过将 db 放入 /src 中


推荐