flyway - 大多数(但不是全部)Java Flyway 迁移被跳过
问题描述
问题的症状是 3 倍,使用 gradle: - flywayMigrate 失败并出现 org.flywaydb.core.api.FlywayException:验证失败:检测到的应用迁移未在本地解决:1.1 - flywayInfo 将大量迁移报告为缺失,基本上是所有 JDBC 迁移.
Versioned 1.0 create initial db SQL 2013-04-05 10:49:18 Success
Versioned 1.1 InsertEnum JDBC 2013-04-05 10:49:18 Missing
Versioned 1.2 InsertDefaultCampaign JDBC 2013-04-05 10:49:18 Missing
虽然实际上在数据库级别,但 schema_version 表将它们报告为
2 2 1.0 create initial db SQL V1_0__create_initial_db.sql 1924949074 ACCTESTING 05-APR-13 10.49.18.288446000 AM 1843 1
3 3 1.1 InsertEnum JDBC cern.acctesting.db.migrations.base.V1_1__InsertEnum ACCTESTING 05-APR-13 10.49.18.486188000 AM 95 1
4 4 1.2 InsertDefaultCampaign JDBC cern.acctesting.db.migrations.base.V1_2__InsertDefaultCampaign ACCTESTING 05-APR-13 10.49.18.652105000 AM 83 1
- 来自任务报告的日志表明这些类被发现:
13:43:01.219 [QUIET] [system.out] [DEBUG] - Found class: cern.acctesting.db.migrations.base.V1_1__InsertEnum
13:43:01.220 [QUIET] [system.out] [DEBUG] - Found class: cern.acctesting.db.migrations.base.V1_2__InsertDefaultCampaign
另一方面,许多其他课程被跳过:
13:43:01.265 [QUIET] [system.out] [DEBUG] - Skipping non-instantiable class (invocation error): cern.acctesting.db.migrations.content.V2_3_2__CreateTestPhaseAndSignOnlyTestsForBeamLossMonitors
阶级结构没有根本区别。
我有一个过去执行多次迁移到 3.5.2 的数据库。它在带有 Flyway 3.1 的 Oracle 11g 上运行。我现在将所有内容升级到 Oracle 18c 和 Flyway 5.2.4。我正在使用 gradle 4.9 和插件 flyway-gradle-plugin:5.2.4
注意可能与问题有关或无关,我必须手动编辑 schema_version 表以将类型 INIT 更改为 BASELINE(以及相应的校验和)。
我试图删除所有弃用,使我的所有迁移类适应 5.2.4 BaseJavaMigration,但没有成功。
然后我尝试使用 flyway 命令行 5.2.4,从我运行 Gradle 的 IDE 构建一个 jar,并在 CLI 中使用它。然后我就更糊涂了:
Versioned 1.0 create initial db SQL 2013-04-05 10:49:18 Success
Versioned 1.1 InsertEnum JDBC 2013-04-05 10:49:18 Success
Versioned 1.2 InsertDefaultCampaign JDBC 2013-04-05 10:49:18 Missing
我试图在本地重现该问题,在单元测试中执行与 flyway 类似的代码。我无法重现该问题。我一直在调试模式下运行 gradle 和 no-daemon 来附加调试器并查看类是如何加载的。我没有发现任何错误......它依赖于包含整个类路径的 URLClassLoader,它似乎是正确的。
迁移 1.1 和 1.2 之间没有根本区别
@Transactional(propagation=Propagation.REQUIRED)
public class V1_1__InsertEnum implements JdbcMigration {
@Override
public void migrate(Connection connection) throws Exception {
insertTestStepStates(connection);
insertSignatureTypes(connection);
insertLocktype(connection);
}
/// some private method definitions
}
@Transactional(propagation = Propagation.REQUIRED)
public class V1_2__InsertDefaultCampaign implements JdbcMigration {
@Override
public void migrate(Connection connection) throws Exception {
long campaignId = getCampaignId(connection);
insertDefaultCampaign(connection, campaignId);
insertDefaultTestPlan(connection, campaignId);
insertActiveCampaign(connection, campaignId);
}
/// some private method definitions
}
我让它们移植以扩展 BaseJavaMigration,甚至自己实现 JavaMigration。它什么也没改变。
所以这是我目前的观察和问题: - 对于相同的代码,我的 flyway 命令行工具和 gradle flyway 插件之间的行为不一致,两个版本都是 5.2.4 - 我的大多数类都不能被 Flyway 加载,我'不知道为什么 - 加载的类无论如何都没有在本地解决,我不知道为什么
也许我错过了一些非常明显的东西,并且无缘无故地挖掘得太深?知道有什么问题吗?
解决方案
推荐阅读
- asp.net-core - asp.net core 3.1 web api的解决方案是什么
- c# - 在 MVC 中检查 ViewBag 的布尔值
- paypal - 如何使用 PayPal Invoicing webhook 上线?
- reactjs - 如何使用 jest 测试反应组件的标题?
- https - esp32、esp32_https_server 库、自签名证书、cors 和 499 状态码
- reactjs - 在 VS Code 中使用 Typescript 类型检查 React 组件道具
- c++ - 如何使用 Visual Studio 2019 从 ActiveX 控件添加类?
- java - 我怎样才能在没有发生之前获得锁?
- authentication - NiFi ListSFTP 连接器无法连接到 sftp 服务器
- excel - 无法设置字符类的文本属性