如何在Jar包内部打包和使用嵌入式数据库(H2.db文件)?

9
我正在使用H2嵌入式数据库开发我的应用程序。如果可能的话,我希望将应用程序需要的所有内容(包括数据库)都包含在其自己的Jar文件中。我的应用程序不需要创建临时文件或其他任何东西,因此用户只需运行Jar文件即可。
是否有可能将数据库嵌入到Jar文件中,并能够插入新记录以及仅查询?
编辑:为了澄清,我不是要将H2驱动程序jar文件嵌入到我的可分发jar文件中,我是要将h2数据库文件(someDatabase.h2.db文件)嵌入到一个Jar文件中,并仍然能够从该数据库中读取/写入数据。
1个回答

10

如果您希望将myDatabase.h2.db文件嵌入.jar中,您可以这样做,但是您只能以只读方式访问数据库。由于.jar文件是只读的,因此您无法对其进行修改,因此无法执行INSERTDELETE或任何DDL命令。

话虽如此,以下是关于如何嵌入只读文件的说明。

根据H2的文档

JDBC URL"jdbc:h2:~/myDatabase"告诉H2引擎在当前用户的主目录中查找名为myDatabase.h2.db的数据库文件。

JDBC URL"jdbc:h2:file:/myDatabase"告诉H2引擎在当前目录(执行java程序的地方)中查找名为myDatabase.h2.db的数据库文件。

如果您将h2.db文件嵌入到.jar中,则无法以普通方式访问它。它只能作为zip文件中的文件访问。

为了让H2使用它,您必须使用zip作为URL:

jdbc:h2:zip:~/data.zip!/test

更多信息请参见 "在Zip或Jar文件中只读数据库"。

当你将文件作为资源嵌入到jar中时,你可以获得它的相对URL。使用...

MyClass.class.getClassLoader().getResource("myDatabase.h2.db")

...你会得到类似于:

jar:file:/C:/folder1/folder2/myJar.jar!/myDatabase.h2.db

然后,您可以将其作为字符串进行操作并传递给H2作为JDBC URL连接。


1
将数据库文件本身(即someDatabase.h2.db文件)嵌入到我的Jar包中,而不是驱动程序Jar包。 - SnakeDoc
2
我可以告诉你一件事:即使你能将h2.db文件嵌入.jar文件中,你也无法进行插入操作,因为jar文件是只读的... - acdcjunior
1
我很担心这个问题...即使这个jar文件没有被压缩(实际上,jar文件只是zip文件),我也不确定我能否对其进行读写操作... - SnakeDoc
2
没错。在使用.properties文件时非常普遍。它们使用只读的嵌入式jar文件,直到用户决定进行更改为止。当发生更改时,它们会像你提到的那样,在文件夹中创建一个文件。(或者在当前jar文件的文件夹或子文件夹中。) - acdcjunior
2
就是这样。事实证明,你确实可以将其用作只读。请查看更新后的答案。如果需要更多的代码示例,请告诉我。 - acdcjunior
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接