Spring Boot3+JDK17执行liquibase:diff报NoSuchMethodError求助
问题:Spring Boot 3 + JDK17执行
liquibase:diff时出现NoSuchMethodError错误 执行Maven命令liquibase:diff时触发如下错误:
Caused by: java.lang.NoSuchMethodError: 'javax.persistence.spi.PersistenceUnitInfo org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainDefaultPersistenceUnitInfo()' at liquibase.ext.hibernate.database.HibernateSpringPackageDatabase.createEntityManagerFactoryBuilder (HibernateSpringPackageDatabase.java:86) at liquibase.ext.hibernate.database.HibernateEjb3Database.buildMetadataFromPath (HibernateEjb3Database.java:57)
我的pom.xml中liquibase相关配置如下:
<profile> <id>liquibase</id> <activation> <activeByDefault>false</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>4.4.1</version> <configuration> <propertyFile>src/main/resources/liquibase.properties</propertyFile> <changeLogFile>src/main/resources/db/db.changelog-master.xml</changeLogFile> <diffChangeLogFile>src/main/resources/db/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile> <logging>info</logging> </configuration> <executions> <execution> <id>update-profile</id> <phase>process-resources</phase> <goals> <goal>update</goal> </goals> </execution> <execution> <id>diff-profile</id> <phase>process-test-resources</phase> <goals> <goal>diff</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <dependency> <groupId>org.liquibase.ext</groupId> <artifactId>liquibase-hibernate5</artifactId> <version>4.19.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.0-GA</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> </plugin> </plugins> </build> </profile>
我已经尝试在liquibase插件下添加不同依赖,现在疑惑:JDK17中javax.persistence是否已被jakarta.persistence替代?
解决方案
核心结论
是的,Spring Boot 3基于Jakarta EE 9+规范,已经全面从javax.persistence迁移到jakarta.persistence,这是导致错误的根本原因。你的配置中存在以下几个问题:
- liquibase-hibernate5版本不兼容:
liquibase-hibernate5是为Hibernate 5设计的,而Hibernate 5依赖的是javax.persistenceAPI,和Spring Boot 3使用的Jakarta API冲突。 - liquibase-maven-plugin版本过旧:4.4.1版本的插件对Jakarta API支持不足,无法适配Spring Boot 3的环境。
修改步骤
- 替换
liquibase-hibernate5为liquibase-hibernate6(适配Hibernate 6,支持Jakarta API) - 升级
liquibase-maven-plugin到支持Jakarta的版本(推荐4.24.0及以上) - 确保所有依赖均为Jakarta版本,移除任何残留的
javax相关依赖
修改后的插件配置示例:
<plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>4.24.0</version> <!-- 升级到支持Jakarta的版本 --> <configuration> <propertyFile>src/main/resources/liquibase.properties</propertyFile> <changeLogFile>src/main/resources/db/db.changelog-master.xml</changeLogFile> <diffChangeLogFile>src/main/resources/db/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile> <logging>info</logging> </configuration> <executions> <execution> <id>update-profile</id> <phase>process-resources</phase> <goals> <goal>update</goal> </goals> </execution> <execution> <id>diff-profile</id> <phase>process-test-resources</phase> <goals> <goal>diff</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <dependency> <groupId>org.liquibase.ext</groupId> <artifactId>liquibase-hibernate6</artifactId> <!-- 替换为hibernate6版本 --> <version>4.24.0</version> <!-- 和插件版本保持一致 --> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.0-GA</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> </plugin>
修改后重新执行liquibase:diff命令即可解决该错误。
内容的提问来源于stack exchange,提问作者Anurag Singh
相关产品推荐
相关产品推荐

