【问题标题】:Liquibase different behavior when using CLI and Maven使用 CLI 和 Maven 时的 Liquibase 不同行为
【发布时间】:2025-11-22 19:50:02
【问题描述】:

我正在将 Liquibase 集成到现有项目中。我使用 CLI 从数据库生成更改日志并执行 changeLogSync。我验证了 databasechangelog 表包含来自生成日志的数据。

当我尝试从 CLI 中生成的更改日志更新数据库时:

liquibase --changeLogFile=changeLog.xml --url="jdbc:postgresql://database_server:port/database --defaultSchemaName=public update

结果为@​​987654322@。

当我尝试在 Maven 中做同样的事情时它失败了:Failed to execute goal org.liquibase ... Error setting up or running Liquibase: Migaration failed for change set ... Reason: liquibase.exception.DatabaException: ERROR: relation already exists.

请注意,我没有修改 changeLog.xml 文件并且我已经执行了 changeLogSync,因此更新预计不会执行任何操作,但在使用 Maven 时它会尝试创建所有的关系。

Maven 配置具有以下结构:

<configuration>
  <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
  <propertyFile>liquibase.properties</propertyFile>
  <defaultSchemaName>public</defaultSchemaName>
</configuration>
<executions>
  <execution>
  <id>update</id>
  <phase>pre-integration-test</phase>
  <goals>
    <goal>updateSQL</goal>
    <goal>update</goal>
  </goals>
  </execution>
</executions>

liquibase.properties 文件包含其余参数,与 CLI 命令中的参数相同。

liquibase 版本:3.4.1 postgresql 版本:9.4-1201-jdbc41

我知道我可以在 changeLog.xml 中使用先决条件来防止创建存在的表,但我认为在设计上最好修复 Maven 配置。

为什么 CLI 和 Maven 执行之间存在差异?对于如何使用 Maven/Liquibase(调试方法)解决此类问题的任何建议,我也将不胜感激。

【问题讨论】:

    标签: postgresql maven liquibase


    【解决方案1】:

    这可能是由不同的“工作目录”引起的。根据环境,Liquibase 以不同的方式解析变更日志的文件名。由于文件名是表 databasechangelog 中唯一键的一部分,Liquibase 可能认为特定的更改集尚未执行。

    如果您检查databasechangelog 中的filename 列,您可能会看到不同的值,具体取决于您运行更改日志的环境。

    我们通过将属性 logicaFilePath 添加到每个 XML 文件的 changeLog 标记来解决此问题。该值是没有任何目录的纯文件名。

    类似:

    <databaseChangeLog 
         xmlns="...." 
         xmlns:xsi="..." 
         xsi:schemaLocation="...."
         logicalFilePath="changelog_v1.xml">  
    

    【讨论】:

    • 您可以确保您在命令行中使用的类路径与 Maven 类路径匹配,而不是指定逻辑文件路径。但logicalFilepath 确保它们被视为相同。
    • @NathanVoxland:感谢您提供的信息,但我该怎么做呢?
    • 命令行 liquibase 有一个 -classpath 属性。确保设置为包含与 Maven 使用的相同的类路径根目录,其中包含更改日志文件。
    最近更新 更多