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
相关产品推荐
相关产品推荐

