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

