将 sqlite DB 添加到可执行 JAR 文件

Posted

技术标签:

【中文标题】将 sqlite DB 添加到可执行 JAR 文件【英文标题】:add sqlite DB to executable JAR file 【发布时间】:2013-02-17 16:25:27 【问题描述】:

我正在使用 JAVA(带有 eclipse juno)并尝试创建一个包含 sqlite DB 文件的可执行 JAR 文件。 我尝试通过这一行连接到数据库:

DriverManager.getConnection("jdbc:sqlite:"+DataController.class.getResource("test.sqlite").getPath())

DataController 是一个位于 sqlite 所在位置的类。

我一直收到错误:

java.sql.SQLException: invalid database address

有人可以帮助并逐步说明如何将 sqlite DB 包含在可执行 JAR 文件中吗?

【问题讨论】:

当给定的数据库 URL 无效时会发生此错误。尝试打印出你给getConnection()的字符串 我已经打印出来了,这是到 sqlite DB 的确切路径。 【参考方案1】:

显然 sqlite-jdbc 可以自己打开资源。根据这个线程https://groups.google.com/forum/?fromgroups=#!topic/xerial/Oayzj5nrJGk,将 :resource 添加到路径中。所以尝试以下方法:

DriverManager.getConnection("jdbc:sqlite::resource:package/test.sqlite"); 

或取决于 sqlite 的版本

DriverManager.getConnection("jdbc:sqlite::resource:package/test.db"); 

将包替换为该文件所在包的“/”分隔路径。

请注意,它实际上会将文件复制到 tmp 目录。-

【讨论】:

我使用 jdbc:sqlite::resource 读到:数据库是只读的。 如果您的数据库(如我的)只是在项目的 resources 目录中,那么以下连接字符串就足够了:jdbc:sqlite::resource:test.sqlitejdbc:sqlite::resource:test.db 取决于您的SQLite 版本。我花了太多时间试图弄清楚这一点。 resource 添加到 URI 是它工作的原因,因为没有它,驱动程序假定您的数据库与连接到它的文件位于同一目录中。 我遵循这个并得到一个异常 java.sql.SQLException: resource quanlythuchi3.sqlite not found: java.net.MalformedURLException: no protocol: MyDB.sqlite @Chris Cirefice 非常感谢您的评论。你的建议对我有用。 非常感谢@Chris Cirefice .. 我面临着完全相同的异常,您的评论让我很开心... :)【参考方案2】:

::resource 的方式是正确的。如果您使用的是::resource,但这些解释会有所帮助,但仍然会遇到像resource database.db not found: java.net.MalformedURLException: no protocol: database.db 这样的错误,比如verdana。

最常见的答案是: DriverManager.getConnection("jdbc:sqlite::resource:path/to/database.db")

但是,path/to/database.db 必须是您的 jar 文件的确切路径(真实文件系统中的路径,而不是 Jar 中的路径)。

我推荐使用getClass().getResource():

DriverManager.getConnection("jdbc:sqlite::resource:" + 
        getClass().getResource("/path/to/db/in/the/jar/file"))

注意/path/to/db/in/the/jar/file部分必须以/开头

【讨论】:

【参考方案3】:

我不确定这在最近的 JDBC 版本中是否发生了变化,但是在摆弄了大约一个小时并遇到各种异常(MalformedURLException 和“数据库已关闭”)后,我发现以下内容对我有用:

DriverManager.getConnection("jdbc:sqlite::resource:file:/path/to/database.db")

:file: 部分似乎从其他答案中丢失,没有它我无法让它工作。

另外,请注意

/path/to/database.db

是从 .jar 文件的根目录开始的绝对路径,而不是普通的资源根目录。

【讨论】:

【参考方案4】:
jdbc:sqlite::resource:notes_app.db

为我工作。我的数据库(notes_app.db)位于生成的 jar 文件的根目录中。

public class Database 
    public static Connection con () throws SQLException 
        String url = "jdbc:sqlite::resource:notes_app.db";
        return DriverManager.getConnection(url);
    

我的 notes_app.db 位于生成的 jar 的根目录中。我正在使用 ma​​vennotepadd++

进行开发

【讨论】:

以上是关于将 sqlite DB 添加到可执行 JAR 文件的主要内容,如果未能解决你的问题,请参考以下文章

Maven引入本地依赖Jar到可执行Jar包中

如何将 oracle XE 数据库嵌入到可执行 jar 中?

如何将提交哈希添加到可执行文件的详细信息

带有 GCC 的 C/C++:将资源文件静态添加到可执行文件/库

Maven - 如何将任意类路径条目添加到 jar?

将sqlite数据库添加到jar时出现sql错误或缺少数据库