【问题标题】:Package and use embedded database (H2.db file) inside a Jar?在 Jar 中打包和使用嵌入式数据库(H2.db 文件)?
【发布时间】:2013-04-05 05:10:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: java database jar packaging h2


    【解决方案1】:

    如果您希望将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

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

    【讨论】:

    • 见我上面的编辑。更希望将数据库文件本身(即 someDatabase.h2.db 文件)嵌入到我的 Jar 中,而不是驱动程序 jar。
    • 我已经可以告诉你一件事:即使你可以将 h2.db 文件嵌入到 .jar 中,你也无法进行插入,因为 jar 文件是只读的......
    • 我很害怕...即使 jar 没有被压缩(jar 只是 zip 真的),我不确定我是否可以读/写它...跨度>
    • 没错。这在使用.properties 文件时很常见。他们使用只读的 jar 嵌入文件,直到用户决定进行更改。发生这种情况时,他们会在您提到的文件夹中创建一个文件。 (或在当前 jar 的文件夹或子文件夹中。)
    • 你去。事实证明,您确实可以将其用作只读。查看更新的答案。如果您需要更多代码示例,请告诉我。
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2011-01-27
    • 2021-01-07
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多