首页 > 解决方案 > 大多数(但不是全部)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 加载,我'不知道为什么 - 加载的类无论如何都没有在本地解决,我不知道为什么

也许我错过了一些非常明显的东西,并且无缘无故地挖掘得太深?知道有什么问题吗?

标签: flyway

解决方案


推荐阅读