在 Liquibase 4.0 中删除了通过绝对路径指定文件

Specifying files by absolute path was removed in Liquibase 4.0

当我 运行 我的 Spring 引导应用程序时,我收到以下 liquibase 错误:

在 Liquibase 4.0 中删除了通过绝对路径指定文件。请使用相对路径或在class路径参数中添加'/'。

这是 application.yaml 中的 class 路径:

  liquibase:
    change-log: classpath:db/changelog/db-changelog-master.xml

我也试过:

  liquibase:
    change-log: classpath:/db/changelog/db-changelog-master.xml

文件夹结构如下:

更新日志大师:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <include file="db-changelog-1.0.xml"/>
</databaseChangeLog>

看起来这已在 v4.4.3 中修复

我在将更改日志文件放在资源文件夹之外时遇到了这个问题,但是如果我将它们包含在 resources/db/changelog 下,那么它可以通过设置波纹管正常工作配置

spring.liquibase.change-log=classpath:/db/changelog/changelog-master.xml

在 4.6.2 下测试

只需尝试从“change-log:”参数中删除“classpath:”。 还请尝试检查您的 pom.xml(配置中的“changeLogFile”标签): 在更改日志文件路径之前不应有“${basedir}”。

<changeLogFile>
  /src/main/resources/liquibase/changelog.xml
</changeLogFile>

正如解释的那样here

How the Liquibase classpath worked before version 4.0

Before version 4.0, one of the default locations Liquibase added to the classpath was the root directory in your filesystem (/). The change caused issues because of a machine-dependent changelog path, such as /home/my-user/projects/liquibase/changelog.xml, found under the / directory. This way, Liquibase uses the given path as part of the changeset identifier stored in the DATABASECHANGELOG table, and when you run Liquibase from /home/other-user/projects/liquibase/changelog.xml, Liquibase sees it as a different changelog and tries to rerun all the previously run changesets.

To prevent identification issues from happening, a / was removed as a default part of the classpath. How the Liquibase classpath works in 4.0 and later versions

Starting with Liquibase 4.0, the root directory (/) is no longer a default part of the classpath because of the issue mentioned in the previous section.

...

消息“请使用相对路径或将‘/’添加到类路径参数。”指的是根目录'/',并不意味着在类路径路径的开头添加斜杠。 Afaik,classpath:xclasspath:/x 是一样的。

此外,无论出于何种原因,找不到主更新日志时都会出现该消息,因此拼写错误也可能导致此消息。这只是一个提示,告诉你它可能找不到,因为文件不在类路径中,因为他们从类路径中删除了根目录,但也找不到,因为你指定了错误的路径(我就是这样做的) .

要正确配置它,主更改日志必须位于 Liquibase 类路径中。在 Spring Boot 中,Liquibase 类路径设置为应用程序的类路径,即您可以使用 src/main/resources.

Tl;dr:当您的文件 src/main/resources/db/changelog/db.changelog-master.xml 使用 spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml

我不知道,对于某些 Liquibase 版本,是否存在或存在与此相关的错误,但这就是 应该 工作的方式,无论如何。

不幸的是,这仍然是一个悬而未决的问题。参见 2281