Liquibase Maven插件报错XMLChangeLogSerializer无法实例化怎么解决?
编译changelog时遇到问题,Liquibase无法加载正确的Serializer,执行diff命令时构建失败,错误提示找不到对应xml扩展名的序列化器。
我的插件配置如下:
<groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>${liquibase.version}</version> <configuration> <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile> <diffChangeLogFile>${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile> <driver>org.h2.Driver</driver> <url>jdbc:h2:file:${project.build.directory}/h2db/db/my_project</url> <defaultSchemaName></defaultSchemaName> <username>my_project</username> <password></password> <referenceUrl>hibernate:spring:com.my.comp?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl> <verbose>true</verbose> <logging>debug</logging> <contexts>!test</contexts> <diffExcludeObjects>oauth_access_token, oauth_approvals, oauth_client_details, oauth_client_token, oauth_code, oauth_refresh_token</diffExcludeObjects> </configuration>
错误信息如下:
[INFO] Cannot load service: liquibase.serializer.ChangeLogSerializer:
Provider liquibase.serializer.core.xml.XMLChangeLogSerializer could
not be instantiated [INFO]
------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO]
------------------------------------------------------------------------ [INFO] Total time: 16.947 s [INFO] Finished at:
2021-09-25T11:57:46+02:00 [INFO]
------------------------------------------------------------------------ [ERROR] Failed to execute goal
org.liquibase:liquibase-maven-plugin:4.3.5:diff (default-cli) on
project notionmeet: [ERROR] Error setting up or running Liquibase:
[ERROR] liquibase.command.CommandExecutionException:
java.lang.RuntimeException: No serializers associated with the
filename or extension
'/home/projects/project/src/main/resources/config/liquibase/changelog/20210925095729_changelog.xml'
- Liquibase版本依赖冲突:liquibase-maven-plugin版本和项目引入的liquibase-core版本不匹配,4.x版本之后序列化器的SPI加载逻辑有调整,版本不一致会导致XMLChangeLogSerializer无法实例化
- 依赖包损坏或SPI注册文件异常:liquibase-core包损坏,或类路径下存在多个重复的序列化器SPI注册文件,导致加载逻辑混乱
- Spring Boot版本覆盖:如果是Spring Boot项目,Spring Boot自带的Liquibase依赖版本和手动配置的插件版本冲突,覆盖了正确的序列化器实现
- changelog目录不存在:diff输出的目标目录未提前创建,间接导致序列化器绑定异常
- 统一全局Liquibase版本,在pom的properties中固定liquibase.version,确保插件和核心依赖版本完全一致:
<properties> <liquibase.version>4.3.5</liquibase.version> </properties>
- 若为Spring Boot项目,排除Spring Boot默认引入的liquibase-core,手动指定对应版本的依赖:
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>${liquibase.version}</version> </dependency>
- 清理本地Maven缓存,重新拉取依赖:
mvn clean install -U
- 提前创建diff输出的目标目录
src/main/resources/config/liquibase/changelog,避免目录不存在导致的异常 - 如以上操作仍未解决,在liquibase-maven-plugin的configuration节点中显式指定序列化器实现:
<changeLogSerializerClass>liquibase.serializer.core.xml.XMLChangeLogSerializer</changeLogSerializerClass>
内容的提问来源于stack exchange,提问作者Borzi

