将嵌入式 h2 数据库添加到可执行 jar

Add an embedded h2 database to an executable jar

我正在编写一个小型 Java 应用程序,将 reads/writes 数据写入嵌入式 h2 数据库。 出于开发目的,我想将数据库添加到从我的应用程序生成的 jar 文件中。

用例是:用户仅获取交付的 jar 文件,并且能够读取数据并将数据写入其中嵌入的数据库。

有办法实现吗?

注意:我正在使用 IntelliJ 开发应用程序并使用 maven 构建项目

您似乎在问两个不同的问题:

  • 如何在我的 JAR 文件中捆绑 H2 数据库引擎 产品?
  • 如何将数据库与我的 JAR 文件捆绑在一起?

绑定数据库引擎库

第一个很简单。告诉你的依赖管理和构建工具,如 Maven or Gradle 包含 H2。这就是此类工具的工作,下载并安装此类库的副本。

对于 Maven,请参阅 Cheat Sheet page for the current Maven dependency XML fragment to include in your POM

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

捆绑数据库

关于在您的 JAR 中捆绑数据库的问题,请研究对您的问题的评论。他们注意到您 无法在部署 运行 时写入 JAR 文件。您的数据库必须存在于您的 JAR 文件之外。各种 OSes 在其文件系统中都有专门的位置供应用程序写入此类数据文件。

一条评论建议您的代码在 JAR 中查找数据库。如果找到,将该数据库复制到 JAR 之外的另一个文件夹。然后继续使用该外部副本。

这种方法可行。但我会选择 schema migration

架构迁移

使用 schema migration, at runtime in deployment you create a new database and then run a series of SQL scripts. Those scripts execute DDL commands such as creating tables. And those scripts run DML 命令根据需要创建行。

您可以选择架构迁移工具来定位、管理和 运行 这些脚本。我比较喜欢 Flyway, though Liquibase 也很受欢迎。其他人也可能存在。