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

Spring Boot集成liquibase-maven-plugin执行diff时缺失ValidatorFactory类

问题描述

我正在将liquibase-maven-plugin集成到Spring Boot项目中。mvn liquibase:update和mvn liquibase:dropAll命令可正常工作,但执行mvn liquibase:diff生成新变更日志文件时,遇到如下错误:

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:4.23.2:diff (default-cli) on project work-with-liquibase: Execution default-cli of goal org.liquibase:liquibase-maven-plugin:4.23.2:diff failed: A required class was missing while executing org.liquibase:liquibase-maven-plugin:4.23.2:diff: jakarta/validation/ValidatorFactory

相关配置文件如下:

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.1</version>
        <relativePath/>
</parent>


<properties>
        <spring.boot.version>${project.parent.version}</spring.boot.version>
        <java.version>17</java.version>
        <liquibase.maven>4.23.2</liquibase.maven>
</properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>8.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>${liquibase.maven}</version>
        </dependency>
    </dependencies>

           <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>${liquibase.maven}</version>
                <configuration>
                    <propertyFile>src/main/resources/liquibase/liquibase-local.properties</propertyFile>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>42.6.0</version>
                    </dependency>
                    <dependency>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-core</artifactId>
                        <version>${liquibase.maven}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.liquibase.ext</groupId>
                        <artifactId>liquibase-hibernate6</artifactId>
                        <version>${liquibase.maven}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-data-jpa</artifactId>
                        <version>${spring.boot.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

liquibase-local.properties

driver: org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/my-db
username=username
password=password

changeLogFile=src/main/resources/liquibase/changelog/db.changelog-master.xml
outputChangeLogFile=src/main/resources/liquibase/changelog/db.changelog-master.xml
diffChangeLogFile=src/main/resources/liquibase/changelog/db.changelog_new.sql

databaseChangeLogTableName=myproject_databasechangelog
databaseChangeLogLockTableName=myproject_databasechangeloglock

referenceUrl=hibernate:spring:com.myproject.entities?dialect=org.hibernate.dialect.PostgreSQLDialect&hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

#referenceUrl=hibernate:spring:com.myproject.entities?dialect=org.hibernate.dialect.PostgreSQLDialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

db.changelog-master.xml

<?xml version="1.0" encoding="UTF-8" ?>

<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-latest.xsd">

    <include file="liquibase/changelog/db.changelog_v1.sql" relativeToChangelogFile="false"/>
    <include file="liquibase/changelog/db.changelog_v2.sql" relativeToChangelogFile="false"/>

</databaseChangeLog>
解决方案

问题原因

liquibase:diff操作依赖Hibernate解析实体类,而Spring Boot 3配套的Hibernate 6依赖Jakarta Validation API,但liquibase-maven-plugin的运行时类路径中缺少该API包。项目依赖里的hibernate-validator不会自动传递到插件类路径,因此需要显式添加。

修复步骤

在liquibase-maven-plugin的<dependencies>中新增Jakarta Validation API依赖:

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
</dependency>

(无需指定版本,Spring Boot Parent会自动管理兼容版本)

修正后的插件完整依赖配置:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.maven}</version>
    <configuration>
        <propertyFile>src/main/resources/liquibase/liquibase-local.properties</propertyFile>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>${liquibase.maven}</version>
        </dependency>
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate6</artifactId>
            <version>${liquibase.maven}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <!-- 新增Jakarta Validation API依赖 -->
        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
        </dependency>
    </dependencies>
</plugin>

版本兼容性说明

  • Spring Boot 3.1.1对应Hibernate 6.2.x,liquibase-hibernate6:4.23.2与该版本兼容;
  • hibernate-validator:8.0.1.Final依赖jakarta.validation-api:3.0.2,版本匹配无冲突;
  • Maven插件类路径与项目主类路径隔离,必须单独添加该依赖,项目依赖不会自动被插件继承。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:24:51