dnlnfr
dnlnfr

Reputation: 57

liquibase-maven-plugin error jakarta/validation/ValidatorFactory when I use liquibase:diff

I'm integrating liquibase-maven-plugin into my spring boot project.

I can use the plugin for mvn liquibase:update and mvn liquibase:dropAll work correctly.

But when I try to use the mvn liquibase:diff to generate the new changelog files, I get this error that I'm unable to resolve.

[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

Can you help me understand what dependencies the plugin needs? Are there perhaps errors of incompatible versions? The documentation is not very clear about this. Thanks in advance to anyone who will try to help me.

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>

Upvotes: 0

Views: 730

Answers (1)

Andrey Alexeev
Andrey Alexeev

Reputation: 11

I faced literally same scenario, except I didn't use mvn liquibase:update nor mvn liquibase:dropAll.

For me it finds out that liquibase-maven-plugin has its own dependencies and ValidationFactory from jakarta.persistence-api was missing. I fixed the issue by adding dependency to jakarta.persistence-api explicitly to Liquibase plugin:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <dependencies>
        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>${jakarta.validation.api.version}</version>
        </dependency>
    </dependencies>
</plugin>

Upvotes: 1

Related Questions