Spring Boot构建运行报错:Liquibase与Flyway相关类缺失问题排查
解决Spring Boot打包后
java -jar启动时Liquibase/Flyway类找不到的问题 问题定位
核心矛盾是:IntelliJ内运行正常,但mvn clean package后用java -jar启动时,出现liquibase.exception.ChangeLogParseException、FlywayMigrationScriptMissingFailureAnalyzer这类ClassNotFoundException,本质是打包后的可执行Jar缺失必要依赖/资源,或Spring Boot自动配置冲突。
分步解决方案
1. 清理依赖冲突,统一数据库迁移工具
Spring Boot同时引入Liquibase和Flyway会触发自动配置冲突,且两者的依赖可能互相干扰:
- 打开
pom.xml,只保留你实际需要的迁移工具依赖:- 若用Liquibase:保留
spring-boot-starter-liquibase,删除所有Flyway相关依赖(包括flyway-core、spring-boot-starter-flyway) - 若用Flyway:保留
spring-boot-starter-flyway,删除所有Liquibase相关依赖
- 若用Liquibase:保留
- 确认依赖范围为默认的
compile,不要手动设置为provided或test(这会导致maven打包时不把依赖打进Jar)
2. 修正Spring Boot Maven插件配置
确保spring-boot-maven-plugin正确配置repackage目标,这是生成包含所有依赖的可执行Jar的关键:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
配置完成后重新执行mvn clean package,生成的Jar才会包含所有必要依赖。
3. 验证资源文件路径正确性
- 若用Flyway:确保
src/main/resources/db/migration目录存在,且包含符合命名规范的迁移脚本(比如V1__init_schema.sql),同时application.properties中无需额外配置(Spring Boot会自动识别该路径) - 若用Liquibase:确保
application.properties中配置的changelog路径正确,比如:
且对应的文件存在于spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yamlsrc/main/resources/db/changelog/下
4. 排除不必要的自动配置(可选)
如果确实需要同时保留两者的依赖(不推荐),可以在启动类上排除其中一个的自动配置,避免加载相关类:
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
错误原因解释
- IntelliJ运行时,会直接加载项目的完整classpath,包括IDE自动补充的依赖、资源文件,即使依赖范围或路径有小问题,IDE也会自动兼容;但maven打包时,严格遵循
pom.xml的依赖配置和资源路径规则,缺失的依赖/错误的路径会直接导致Jar启动时找不到类。 FlywayMigrationScriptMissingFailureAnalyzer找不到,要么是Flyway的starter依赖未正确引入(或版本与Spring Boot不兼容),要么是同时启用Liquibase和Flyway导致自动配置冲突,触发了未被正确加载的异常处理类。
内容的提问来源于stack exchange,提问作者WoistdasNiveau
相关产品推荐
相关产品推荐

