如何使用相对于 project/application 路径的 SQLite 数据库?

How to use SQLite database with path relative to project/application?

我的项目使用 Maven 构建管理器以及 JPA 和 EclipseLink 与 SQLite 数据库进行交互。选择的 IDE 是 NetBeans。然而,这个问题不应该锚定到 IDE,而是锚定在其中开发的应用程序。

我想让我的应用程序生成 SQLite 数据库文件,它将在相对于应用程序位置的路径中使用。有没有办法在 persistence.xml 中指定它,还是我必须手动编写创建文件的过程?

目前在我的 persistence.xml<properties/> 部分中,我有(除其他外):

<property name="javax.persistence.jdbc.url" value="jdbc:sqlite:/home/user/NetBeansProjects/Cookbook/cookbook_db.sqlite"/>

我试过用

替换它
<property name="javax.persistence.jdbc.url" value="jdbc:sqlite:cookbook_db.sqlite"/>

这会在我的 /home 目录中创建一个数据库文件,但是当我尝试与我的 Java 应用程序交互时出现权限错误。输入绝对路径(如第一个示例)可以解决问题。绝对路径真的是强制性的吗?

我正在寻找的行为类似于 - 比方说 - cmakeCMAKE_BINARY_DIR。执行后 cmake 从此变量中提取路径,从而允许用户随意更改二进制目录。 Maven 本身在其 pom.xml 中使用 <relativePath/> 标签支持相对路径。


更新: 我已添加:

<build>

  ...

  <resources>
    <resource>
      <directory>${basedir}/src/main/resources/META-INF/</directory>
      <filtering>true</filtering>
      <includes>
        <include>persistence.xml</include>
      </includes>
    </resource>
  </resources>
</build>

到我的 pom.xml 并且还根据@WillShackleford 的建议将我的 persistence.xml 中的 SQLite 数据库文件的 JDBC URL 属性 更改为:

<property name="javax.persistence.jdbc.url" value="jdbc:sqlite:${basedir}/cookbook_db.sqlite"/>

但是现在我得到:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named CookbookPU

表示未找到persistence.xml

在 maven 中 ${basedir} 应该扩展到项目目录。

<property name="javax.persistence.jdbc.url" value="jdbc:sqlite:${basedir}/cookbook_db.sqlite"/>

为您的persistence.xml设置过滤。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>