Flyway db 首先迁移 Dependent Jar - Spring boot
Posted
技术标签:
【中文标题】Flyway db 首先迁移 Dependent Jar - Spring boot【英文标题】:Flyway db migrate first for Dependent Jar - Spring boot 【发布时间】:2020-12-31 18:58:42 【问题描述】:我有一个构建为 jar 的 Spring Boot 基础项目。这个 jar base-0.0.1-SNAPSHOT.jar
文件在 db/migration/*.sql
中有 flyway 迁移脚本
这个 base-0.0.1-SNAPSHOT.jar
作为依赖添加到 impl-0.0.1-SNAPSHOT-boot.jar
中。同样,这个 impl 引导 jar 在 db/migration/*.sql
中进行了 flyway 迁移。
base jar 的 flyway 迁移创建表,impl boot jar 更改由 base jar 创建的同一个表。
在这种情况下,我需要先运行 base jar 的 flyway 脚本,然后必须遵循 impl boot jar,
基础 jar 中的迁移脚本
db/migration/v1__create.sql, db/migration/v2__create.sql
impl jar 中的迁移脚本
db/migration/v3__create.sql
当 mvn clean install
的 impl jar 时,我收到了这个错误
org.springframework.beans.factory.BeanCreationException: 错误 创建在类路径中定义的名称为“flywayInitializer”的bean 资源 [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 调用 init 方法失败;嵌套异常是 org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: 迁移 V3__create.sql 失败 ------------------------------- SQL 状态:42S02 错误代码:42102 消息:未找到表“BASE_TABLE”; SQL语句:
我已经在base jar包中添加了迁移脚本,但是base jar的flyway脚本仍然没有执行。
在impl boot jar的mvn build过程中,如何先执行base package flyway脚本,再执行impl boot jar的next?
更新 1:
基础 jar 通过下面的插件打包为另一个 Spring Boot 应用程序的一部分,
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <goals> <goal>jar</goal> </goals> <phase>package</phase> <configuration> <classifier>com</classifier> <includes> <include>**/entities/*</include> <include>**/services/*</include> <include>$basedir/src/main/resources/db/migration/*</include> </includes> </configuration> </execution> </executions> </plugin>
impl jar的pom.xml有
<dependency> <groupId>com.group</groupId> <artifactId>base</artifactId> <version>0.0.1-SNAPSHOT</version> <classifier>com</classifier> </dependency>
在这两个 poms 中都没有提到与 flyway 迁移配置相关的内容。默认情况下,它使用默认的flyway配置。
【问题讨论】:
你有一个配置为执行迁移的 maven 插件 - 你能添加这些配置吗? “impl”模块的pom中是否也有相关配置?请将所有这些信息添加到问题中。我还假设,基础 jar 本身不是 Spring Boot 工件,这意味着它不使用 spring-boot-maven-plugin,对吧? @MarkBramnik 请检查问题的更新 为什么在 maven 全新安装期间 flyway 会运行?你有春季启动测试吗? @MarkBramnik 它尝试在测试期间运行。但即使我在测试阶段禁用,在运行期间它也会出现同样的错误 所以前几天我不得不这样做,所以我不会发布答案,而是发布对我有帮助的答案的链接。 the answer 【参考方案1】:我假设“基础”项目 jar 工件本身不是 Spring Boot 应用程序,我的意思是它不是用 spring-boot-maven-plugin 创建的,因为否则它不能作为依赖项包含在内在 impl-boot
模块中(因为 spring boot 应用程序并不是真正的 jar - 所以它不起作用)
基于该假设,flyway 会扫描您的 jars 和“classes”文件夹,并纯粹在运行时查找迁移。这意味着从 base 和 impl 迁移之间应该有任何区别——只要它们在类路径中的预定义位置。 如果没有找到 base 的迁移,那么以下是可能的(在我的脑海中,我可能会遗漏一些东西,但希望它会为调查提供一些方向):
-
基础 jar 未正确打包,请在 Winrar/Winzip 中打开工件并确保迁移确实符合所需的布局。
jar 未正确打包到 Spring Boot 应用程序中。应用程序中的依赖 Jar 通常位于
BOOT-INF/lib
文件夹中,因此请确保它确实出现在那里。
Flyway 迁移位置搞砸了。 Spring boot可以在application.properties
/application.yml
中包含各种flyway定义,见here,尤其是属性spring.flyway.locations
。
可能是数据库的架构搞砸了,一般来说,flyway 迁移不应该包含架构名称,但这通常取决于许多其他因素,所以我只提到它作为一个大方向
最后但并非最不重要的一点是,您可以在实际执行迁移的代码中放置一个断点:请参阅 here 并查看通过调试解决了哪些迁移
【讨论】:
我解压后发现base没有迁移打包。然后我给出了正确的路径,它奏效了。!以上是关于Flyway db 首先迁移 Dependent Jar - Spring boot的主要内容,如果未能解决你的问题,请参考以下文章
Flyway:在 [classpath:db/migration] 中找不到迁移位置
使用 Jenkins 和 Gradle 运行 Flyway 迁移 - 无法解析位置类路径:db/migration
Flyway:找不到迁移位置:[classpath:db / migration]