我在项目中使用 Liquibase 和 Maven - v4.2.0。
我的变更日志位于文件系统上,而不是项目的 JAR 或类路径中。
我使用以下内容来建立我的对象:
liquibase = new Liquibase( changeLogFile, new FileSystemResourceAccessor(), database );
其中
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.
我尝试了各种方法,包括
file:
前缀,并且有问题的文件可以直接在终端中打开。FileSystemResourceAccessor
),我对 ClassLoaderResourceAccessor
的命名概念感到困惑,但我看不到让它工作的方法.
基于非常非常古老的问题,人们以前已经解决过这个问题,但我假设在 4.0 之前? (这在 3.10.3 上运行良好)
有人指点一下吗?我已经使用了 CLI liquibase 并理解了错误,但我不确定如何在不绝对的情况下确定路径,因为我知道这可能会在任意位置的几台不同机器上运行。 这可能是一个小众问题,但提前感谢您的帮助。
强制外部位置实际上成为类路径的一部分
sourceSets {
test {
//whatever else you have
resources {
srcDir 'src/test/resources'
srcDir 'top-external-folder-of-changelog'
}
}
}
dependencies {
testImplementation files (path/to/external/folder)
}
变更日志 schemaLocation 属性如下所示:
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.11.xsd"
记得调整您的版本,
我的具体问题是测试。 对于真实环境,liquibase 脚本通过外部(基于 liquibase)工具应用于数据库。
做出反应。我环顾四周,因为我们也想这样做。 从我的角度来看,我想说这不是一个好方法,因为任何人都可以访问脚本的位置并触摸这些文件,这可能会导致 Liquibase 失败。除了您可以将任何脚本放入该位置并修改数据库之外。
我认为 Liquibase 的作者知道为什么没有直接的方法来做到这一点。
val database =
DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(
new JdbcConnection(
DriverManager.getConnection(
jdbcUrl,
getPostgresContainerConfig().username(),
getPostgresContainerConfig().password())));
new liquibase.Liquibase(
"analytics/target/classes/create_db.sql",
new FileSystemResourceAccessor(
new File("/Users/debrajmanna/code/java/github/sp/src/java/")),
database);
我的文件位于
/Users/debrajmanna/code/java/github/sp/src/java/analytics/target/classes/create_db.sql