You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liquibase执行update命令报错:无法获取ChangeLogParser无参构造方法

问题描述

使用Maven构建项目,pom.xml中已引入liquibase-core依赖:

<dependency>
      <groupId>org.liquibase</groupId>
      <artifactId>liquibase-core</artifactId>
      <version>4.27.0</version>
</dependency>

执行以下代码时:

CommandScope updateCommand = new CommandScope("update")
                    .addArgumentValue("driver", String.valueOf(map.get("driver")))
                    .addArgumentValue("url", String.valueOf(map.get("liquibase.command.url")))
                    .addArgumentValue("username", String.valueOf(map.get("liquibase.command.username")))
                    .addArgumentValue("password", String.valueOf(map.get("liquibase.command.password")))
                    .addArgumentValue(UpdateCommandStep.CHANGELOG_FILE_ARG, LIQUIBASE_CHANGELOG_FILE)
                    .addArgumentValue(UpdateCommandStep.CONTEXTS_ARG, String.valueOf(map.get("contexts")));

updateCommand.execute();

调用updateCommand.execute()时出现错误:

liquibase.servicelocator.null Cannot load service
 java.util.ServiceConfigurationError: liquibase.parser.ChangeLogParser: com.datical.liquibase.ext.parser.ProFormattedSqlChangeLogParser Unable to get public no-arg constructor
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:581)
    at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:672)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1232)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1264)
    at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1299)
    at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1384)
    at liquibase.servicelocator.StandardServiceLocator.findInstances(StandardServiceLocator.java:22)
    at liquibase.parser.ChangeLogParserFactory.<init>(ChangeLogParserFactory.java:39)
    at liquibase.parser.ChangeLogParserFactory.getInstance(ChangeLogParserFactory.java:25)
    at liquibase.command.core.helpers.DatabaseChangelogCommandStep.getDatabaseChangeLog(DatabaseChangelogCommandStep.java:124)
    at liquibase.command.core.helpers.DatabaseChangelogCommandStep.run(DatabaseChangelogCommandStep.java:87)
    at liquibase.command.CommandScope.execute(CommandScope.java:219)

询问是否有缺失的依赖或配置可以修复该错误。

解决方案

这个错误的核心是Liquibase服务加载器尝试加载com.datical.liquibase.ext.parser.ProFormattedSqlChangeLogParser时,找不到其公开无参构造方法。该类属于Datical的Liquibase扩展包,通常是依赖冲突或不必要的扩展包被间接引入导致的,可通过以下方式修复:

  • 排除Datical相关依赖:检查项目依赖树,若存在间接引入的datical-liquibase-extensions,在liquibase-core依赖中添加排除规则:
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>4.27.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.datical</groupId>
            <artifactId>datical-liquibase-extensions</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 限制服务加载范围:在项目的META-INF/services/liquibase.parser.ChangeLogParser文件中,仅保留你实际需要的解析器类名,删除com.datical.liquibase.ext.parser.ProFormattedSqlChangeLogParser这一行。
  • 升级Liquibase版本:部分旧版本的Datical扩展与Liquibase Core存在兼容性问题,尝试将liquibase-core升级到4.30+的稳定版本,可能已修复此类服务加载问题。

内容的提问来源于stack exchange,提问作者Janny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:23:09