将 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.sqlite
或 jdbc: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 的根目录中。我正在使用 maven 和 notepadd++
进行开发【讨论】:
以上是关于将 sqlite DB 添加到可执行 JAR 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 oracle XE 数据库嵌入到可执行 jar 中?