问题描述
我有一个构建为jar的spring boot base项目。这个jar base-0.0.1-SNAPSHOT.jar
文件在db/migration/*.sql
此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的迁移,则可能会发生以下情况(在我脑海中,我可能会遗漏一些东西,但希望它将为调查提供一些指导):
- 未正确包装基本jar,请在Winrar / Winzip中打开工件,并确保迁移确实符合所需的布局。
- 罐子没有正确包装到Spring Boot应用程序中。通常在
BOOT-INF/lib
文件夹中找到应用程序中的依赖Jar,因此请确保它确实出现在其中。 - 空中迁移位置混乱。春季引导可以在
application.properties
/application.yml
中包含各种飞行路线定义,请参见here,尤其是属性spring.flyway.locations
。 - 也许数据库的架构被弄乱了,一般来说,迁移过程中不应该包含架构名称,但这通常取决于许多其他因素,因此我仅将其作为通用方向来提及
- 最后但并非最不重要的一点,您可以在实际执行迁移的代码中放置一个断点:请参见here,并查看通过调试解决了哪些迁移