Liquibase 无法找到用于 4.0 及更高版本的集成测试的更改日志文件

Posted

技术标签:

【中文标题】Liquibase 无法找到用于 4.0 及更高版本的集成测试的更改日志文件【英文标题】:Liquibase is unable to find changelog file for integration tests with versions 4.0 and higher 【发布时间】:2021-12-18 21:47:19 【问题描述】:

我有一个 Spring Boot 测试来检查 Gradle 嵌入式 Postgres 数据库是否已成功创建。我正在使用TestContainers with the JDBC URL 和 liquibase 的 init 函数。

public class TestcontainersPgIT 

    public static final String EMBEDDED_JDBC_URL = "jdbc:tc:postgresql:12.5://localhost:5432/postgres?TC_INITFUNCTION=<package names>.db.LiquibaseRunner::runUpdate";

    @Test
    public void testEmbeddedPg() throws Exception 
        Connection conn = DriverManager.getConnection(EMBEDDED_JDBC_URL);
        Statement statement = conn.createStatement();
        ResultSet rs = statement.executeQuery("select 1");
        assertTrue(rs.next());
        String result = rs.getString(1);
        assertEquals("1", result);
    

上面发生的事情是Connection conn =... 行最终会在下面调用我的 liquibase runner 函数。

public final class LiquibaseRunner 

    private LiquibaseRunner() 
    

    public static void runUpdate(Connection connection) throws LiquibaseException 
        Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));

        Liquibase liquibase = new liquibase.Liquibase("src/test/resources/db/changelog/db.changelog-test.xml", new FileSystemResourceAccessor(), database);
        liquibase.update(new Contexts(), new LabelExpression());


创建新的 liquibase 实例并将路径 (Liquibase liquibase = new...) 传递到更改日志文件的行是任何 Liquibase 版本 >= 4.0 中这些错误的来源。似乎无法在我的tests/resources/db/changelog 目录中找到更改日志文件。我知道这个目录在编译时被复制到 JAR/Build 中,所以我知道文件在那里。它抛出的错误如下所示。

Specifying files by absolute path was removed in Liquibase 4.0. Please use a relative path or add '/' to the classpath parameter.
    at liquibase.parser.core.xml.XMLChangeLogSAXParser.parseToNode(XMLChangeLogSAXParser.java:82)
    at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:15)
    at liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:377)
    at liquibase.Liquibase.lambda$update$1(Liquibase.java:230)
    at liquibase.Scope.lambda$child$0(Scope.java:160)
    at liquibase.Scope.child(Scope.java:169)
    at liquibase.Scope.child(Scope.java:159)
    at liquibase.Scope.child(Scope.java:138)
    at liquibase.Liquibase.runInScope(Liquibase.java:2369)
    at liquibase.Liquibase.update(Liquibase.java:217)
    at liquibase.Liquibase.update(Liquibase.java:203)

我尝试了许多不同的文件路径来传递,包括使用class path 和相对文件路径,但仍然无法找到用于集成测试的变更日志文件。

我尝试过的文件路径

    classpath:db/changelog/db.changelog-test.xml classpath:/db/changelog/db.changelog-test.xml 相对文件路径

【问题讨论】:

【参考方案1】:

您可能只需要这条路径resources/db/changelog/db.changelog-test.xml 或这条路径:../test/resources/db/changelog/db.changelog-test.xml

【讨论】:

这两种方法我都试过了,但对我不起作用。

以上是关于Liquibase 无法找到用于 4.0 及更高版本的集成测试的更改日志文件的主要内容,如果未能解决你的问题,请参考以下文章

Fody 仅在 MSBuild 16 及更高版本上受支持。当前版本:15

不使用 APNS 的 iOS 4.0 及更高版本的推送服务器

为 android 4.0 或更高版本创建自定义锁屏?

pulltorefresh android 4.1及更高版本[重复]

RecyclerView wrap_content 不适用于 API 23 及更高版本

相机无法在纵向 android 2.2 及更高版本中工作