【问题标题】:How to use SQLite database with path relative to project/application?如何使用相对于项目/应用程序的路径的 SQLite 数据库?
【发布时间】:2015-10-10 19:11:12
【问题描述】:

我的项目使用 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 应用程序交互时出现权限错误。输入绝对路径(如第一个示例中所示)可以解决问题。绝对路径真的是强制性的吗?

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


更新:我已添加:

<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。

【问题讨论】:

    标签: java sqlite maven relative-path persistence.xml


    【解决方案1】:

    在 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>
    

    【讨论】:

    • 嗯,将它添加到我的persistence.xml 后,当我尝试访问数据库时,我得到了java.sql.SQLException: path to '${basedir}/cookbook_db.sqlite': '/opt/apache-tomcat-8.0.15/bin/${basedir}' does not exist,并且甚至没有创建数据库文件(因为路径不匹配)。看来我的${basedir} 扩展为我的Tomcat 安装的bin 文件夹。有什么办法改变吗?
    • 可能需要在maven中开启资源过滤。
    • 请看我的更新。由于我是 Maven 新手,如果您能详细说明这一点,我会很高兴。
    • 我认为你的 pom 也会将 persistence.xml 移动到错误的目录。试试我新编辑的。
    • 啊,漂亮。它现在正在工作。知道为什么一切都这么乱吗? :D 我正在为 NetBeans 使用 Vaadin 插件,它使用 Maven。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多