【问题标题】:problem with INIT=RUNSCRIPT and relative pathsINIT=RUNSCRIPT 和相对路径的问题
【发布时间】:2025-12-26 22:05:12
【问题描述】:

我对源路径(src/main src/test)使用 maven 约定,并且我在 src/main/resources/scripts 中有我的 sql 脚本。

我想用 H2 内存运行我的应用程序,我想使用 jdbc url 来初始化我的数据库:

database.url=jdbc:h2:mem:;INIT=RUNSCRIPT FROM 'src/main/resources/scripts/create.sql';

我的问题是这个相对路径 (src/main/... ) 不起作用,如果 init=runscript 命令没有任何目标,H2 也不会崩溃。

有人知道我应该使用什么路径来完成这项工作吗?

谢谢

【问题讨论】:

  • 您写道“如果 init=runscript 命令没有针对任何目标,H2 不会崩溃” - 我无法重现这一点(在这种情况下,H2 会引发异常)。你用的是什么版本的H2?可以试试最新版本吗?我以前不知道这有什么不同,但也许是这样。
  • 不,你是对的,现在它崩溃了。我不知道发生了什么。

标签: java hibernate maven-2 configuration h2


【解决方案1】:

您可以使用以下网址:
"jdbc:h2:mem:sample;INIT=RUNSCRIPT FROM 'classpath:scripts/create.sql'"

有了它,就可以从类路径运行脚本。所以你可以把它 src/main/resources/scripts 或 src/test/resources/scripts 放在你的 maven(或其他)项目中。

【讨论】:

  • 我在 Java 11 上收到 MalformedURLException: unknown protocol: classpath
【解决方案2】:

我建议尝试对初学者使用绝对路径,以检查一切是否正常。之后,检查您的类路径。例如,bin/main/resources/scripts/create.sql,假设 bin 是编译类的位置,并且位于类路径中。

由于您的源代码所在的 src 通常不在类路径中,因此这可能是您的问题的根源。

【讨论】:

  • 使用绝对路径,它可以工作,但不是我尝试过的相对路径的任何组合。
  • @Maxime:H2 会抛出任何错误吗?是否有任何迹象表明未找到 create.sql ?您是否尝试将 create.sql 放在类路径中?
  • 对不起:使用绝对路径,它可以工作,但不是我尝试过的相对路径的任何组合。脚本在 mywar.war/WEB-INF/classes/scripts/.. 我试过 /WEB-INF/.. WEB-INF/.. 等没有结果:/
  • 因为src,您的源代码所在的位置,通常不在类路径中 在 Maven 项目中 src/main/resources 中的任何内容通常包含在类路径中