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

out*_*lou 29 java sqlite swing executable-jar

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

Project/DatabaseFile
Run Code Online (Sandbox Code Playgroud)

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

No such table : table1
Run Code Online (Sandbox Code Playgroud)

这意味着无法访问数据库.当我检查生成的JAR文件的内容时,数据库文件不再存在.

在代码中,我将数据库链接如下:

jdbc:sqlite:DatabaseFile
Run Code Online (Sandbox Code Playgroud)

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

编辑

当我将DB文件放在源文件夹中Project/src/DatabaseFile并将路径更改为时jdbc:sqlite:src/DatabaseFile,它在Eclipse上运行,但在运行Jar文件时再次运行java -jar Project.jar.它说:

path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist
Run Code Online (Sandbox Code Playgroud)

我想我需要为数据库指定一个相对路径.

编辑

这是我连接数据库的方式:

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;
}
Run Code Online (Sandbox Code Playgroud)

dsh*_*dsh 39

你在SQLite上使用什么库?

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

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

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

"jdbc:sqlite::resource:DatabaseFile"
Run Code Online (Sandbox Code Playgroud)

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

  • 我使用的是sqlitejdbc-v056.所以我将其更改为sqlite-jdbc-3.6.14.1并使用此路径连接到数据库"jdbc:sqlite :: resource:DatabaseFile"(数据库文件位于src文件夹下).它在Eclipse和导出器Jar中运行良好.谢谢 (2认同)