Flyway db首先迁移为从属Jar-春季启动

问题描述

我有一个构建为jar的spring boot base项目。这个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中进行飞车迁移。

基本jar的运行方式迁移会创建表,而impl引导jar会更改基本jar创建的同一表。

在这种情况下,我需要首先运行基本jar的flyway脚本,然后必须遵循impl引导jar,

基本jar中的迁移脚本

db / migration / v1__create.sql
db / migration / v2__create.sql

impl jar中的迁移脚本

db / migration / v3__create.sql

mvn clean install的展示罐中,出现了此错误

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语句:

我在基本jar包添加了迁移脚本,但仍未执行基本jar的flyway脚本。

如何在mvn boot jar的mvn构建过程中首先执行基本程序包flyway脚本,然后执行impl boot jar的下一步。?

更新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>

在两个pom中都没有提到与飞行路线迁移配置有关的内容认情况下,它使用认的飞行路线配置。

解决方法

我认为“基础”项目jar构件本身不是本身的Spring Boot应用程序,我的意思是它不是使用spring-boot-maven-plugin创建的,因为否则,它就不能作为依赖项包含在内。在impl-boot模块中(因为spring boot应用程序实际上不是jar,因此无法正常工作)

基于此假设,flyway会扫描jars和“ classes”文件夹,并纯粹在运行时中查找迁移。这意味着从基本迁移和隐式迁移之间应该有任何区别-只要它们在预定义位置的类路径中即可。 如果找不到base的迁移,则可能会发生以下情况(在我脑海中,我可能会遗漏一些东西,但希望它将为调查提供一些指导):

  1. 未正确包装基本jar,请在Winrar / Winzip中打开工件,并确保迁移确实符合所需的布局。
  2. 罐子没有正确包装到Spring Boot应用程序中。通常在BOOT-INF/lib文件夹中找到应用程序中的依赖Jar,因此请确保它确实出现在其中。
  3. 空中迁移位置混乱。春季引导可以在application.properties / application.yml中包含各种飞行路线定义,请参见here,尤其是属性spring.flyway.locations
  4. 也许数据库的架构被弄乱了,一般来说,迁移过程中不应该包含架构名称,但这通常取决于许多其他因素,因此我仅将其作为通用方向来提及
  5. 最后但并非最不重要的一点,您可以在实际执行迁移的代码中放置一个断点:请参见here,并查看通过调试解决了哪些迁移