【问题标题】:liquibase-maven-plugin and sqlFileliquibase-maven-plugin 和 sqlFile
【发布时间】:2016-09-23 05:53:45
【问题描述】:

我正在尝试使用 liquibase-maven-plugin 来运行我的数据库更新。我有以下插件配置:

<configuration>
    <username>${dba.username}</username>
    <password>${dba.password}</password>
    <url>${caesium.url}</url>
    <changeLogFile>master.xml</changeLogFile>
    <driver>org.postgresql.Driver</driver>
    <includeArtifact>true</includeArtifact>
</configuration>

我将数据库更改日志(和 SQL)文件保存在 src/main/resources 中。我的变更集如下:

master.xml:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
    <include file="baseline.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

baseline.xml:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="base-roles" author="asdf" dbms="PostgreSQL">
        <sqlFile path="sql/some-file.sql" relativeToChangelogFile="true"/>
    </changeSet>
</databaseChangeLog>

some-file.sql 是在资源的 sql 子目录中指定的(因此,相对于变更日志,它 sql/some-file.sql)。

唉!上面的构造不起作用! liquibase 找不到 sql 文件。

奇怪的是,当我将主脚本设置为绝对路径时,一切正常。但是,这不是我想要做的(我不想在 databasechangelog 表中有绝对路径)。

【问题讨论】:

  • 哦...我想我知道问题出在哪里:如果主脚本不在子目录中,liquibase 无法找出“基本”目录。将所有内容更深入地移动(以便我的 master.xml 为 foo/master.xml),解决了问题。
  • 你可以使用${project.basedir}然后避免硬编码项目名称。
  • 我想了解您是如何解决它的,“master.xml”和“baseline.xml”是否位于同一目录中? 'sql'文件夹的位置怎么样?你能提供目录结构吗?谢谢
  • 我不想使用 project.basedir,因为这样做会使 databasechangelog 中的文件名是绝对的。你不想这样做,因为如果你从不同的目录运行你的 maven 构建,liquibase 会认为这是一个不同的变化。

标签: maven liquibase


【解决方案1】:

我会回答我自己的问题,以防其他人有类似的问题(从评论中,我可以看到有人碰到了这个问题)。

问题是这样的:我将我的主脚本(更改文件)指向为:&lt;changeLogFile&gt;master.xml&lt;/changeLogFile&gt;。 Liquibase 在类路径中找到它,但由于某种原因,无法确定它在哪个目录中(我认为这只是一个错误)。

我的结构(一个不起作用的)是这样的:

src/main/resources master.xml baseline.xml sql somefile.sql

一切都有relativeToChangelogFile="true",所以如果liquibase找到master.xml,它应该能够找到其他一切。解决方法是将所有内容放在子目录中。这样的事情会做:

src/main/resources liquibase-bug-workaround master.xml baseline.xml sql somefile.sql

...并将插件配置更改为&lt;changeLogFile&gt;liquibase-bug-workaround/master.xml&lt;/changeLogFile&gt;。无需其他更改,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2017-05-15
    • 1970-01-01
    • 2020-05-15
    • 2017-10-16
    • 2021-06-23
    相关资源
    最近更新 更多