8

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

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

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

我一直收到一个错误:

java.sql.SQLException: invalid database address

有人可以提供有关如何在可执行 JAR 文件中包含 sqlite DB 的分步说明吗?

4

4 回答 4

15

显然 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 目录。-

于 2013-03-03T15:26:40.863 回答
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 文件的确切路径( Real File System 中的路径但不是 Jar 中的路径)。

我建议使用getClass().getResource()

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

注意:该/path/to/db/in/the/jar/file部分必须以/

于 2016-04-14T13:46:01.727 回答
0

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

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

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

另外,请注意,

/path/to/database.db

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

于 2017-06-09T15:58:54.580 回答
0
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 的根目录中。我正在使用mavennotepadd++ 进行开发

于 2018-09-19T19:47:39.983 回答