设置 Liquibase Java 在类路径/jar 之外使用变更日志

Chr*_*s J 8 liquibase

我在项目 v4.2.0 中使用 Liquibase 和 Maven。

我的更改日志位于文件系统上,而不是项目的 JAR 或类路径中。

我使用以下内容来建立我的对象:

liquibase = new Liquibase( changeLogFile, new FileSystemResourceAccessor(), database );
Run Code Online (Sandbox Code Playgroud)

那里changelogFile是类似的东西~/liquibase-sql/changelog/db.changelog.xml

当我调用 时liquibase.validate(),在提醒类路径位置后,我得到以下信息:

Specifying files by absolute path was removed in Liquibase 4.0. Please use a relative path or add '/' to the classpath parameter.
Run Code Online (Sandbox Code Playgroud)

我已经尝试了各种方法,包括file:前缀,并且问题文件可以直接在终端中打开。
我查看了代码,FileSystemResourceAccessor如果它只能使用类路径(已经有一个ClassLoaderResourceAccessor),我对这样命名的概念感到困惑,但我看不到让它工作的方法。

基于非常非常古老的问题,人们以前已经解决过这个问题,但我假设在 4.0 之前?(这在 3.10.3 上运行良好)

有人有任何指点吗?我已经使用了 CLI liquibase 并理解了错误,但我不确定如何在没有绝对路径的情况下无法确定路径,因为我知道这可能会在任意位置的几台不同机器上运行。

这可能是一个小问题,但提前感谢您的帮助。

dem*_*iak 3

这是我最终所做的(对于基于 gradle 的项目):

  • 强制外部位置实际上成为类路径的一部分
  • 将 XSD 位置更改为完整 URL(显然 liquibase 有足够的智能,不会从在线位置获取该位置,而是从与分发 JAR 捆绑在一起的 XSD 文件的缓存中加载。

对于 gradle,这意味着向 build.gradle 添加一些内容,如下所示:

sourceSets {
  test {
    //whatever else you have
    resources {
      srcDir 'src/test/resources'
      srcDir 'top-external-folder-of-changelog'
    }
  }
}    
dependencies {
  testImplementation files (path/to/external/folder)
}
Run Code Online (Sandbox Code Playgroud)

变更日志 schemaLocation 属性如下所示:

xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.11.xsd"
Run Code Online (Sandbox Code Playgroud)

请记住根据您的版本进行调整,

我的具体问题是测试。对于真实环境,liquibase 脚本通过外部(基于 liquibase)工具应用于数据库。