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

时间:2013-04-12 15:29:15

标签: java database jar packaging h2

我正在为我的应用程序使用H2嵌入式数据库。我想在其自己的Jar中包含应用程序所需的所有内容,如果可能的话,包括它的数据库。我的应用程序不需要创建临时文件或任何东西,所以基本上用户只运行Jar。

是否可以在Jar中嵌入数据库,并且能够INSERT新记录以及SELECT出来?

编辑:只是为了澄清,我不打算将H2驱动程序jar嵌入到我的可分发jar中,我希望将h2数据库文件(someDatabase.h2.db文件)嵌入到Jar中并仍然能够从该数据库写入/读取。

1 个答案:

答案 0 :(得分:9)

如果您希望将myDatabase.h2.db文件嵌入.jar,您可以这样做,但您将拥有对数据库的只读权限。由于.jar文件是只读的,因此无法修改它们,因此无法执行INSERTDELETE或任何DDL命令。

话虽如此,下面是关于如何以只读方式嵌入它的解释。

根据H2's documentation

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

在“Read Only Databases in Zip or Jar File”中查看更多内容。

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

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

......你会得到类似的东西:

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

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