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在不同db之间迁移

Flyway:在 [classpath:db/migration] 中找不到迁移位置

使用 Jenkins 和 Gradle 运行 Flyway 迁移 - 无法解析位置类路径:db/migration

Flyway:找不到迁移位置:[classpath:db / migration]

为了确定必须运行哪个迁移,Flyway 对数据库进行了多少次往返?

flyway 后的 Flyway 迁移错误:基线