【问题标题】:Flyway not finding the migrations in a jar fileFlyway 在 jar 文件中找不到迁移
【发布时间】:2012-06-28 21:02:45
【问题描述】:

我在我支持的许多应用程序中实现了 Flyway,它的工作就像做梦一样。

但是,一旦我将应用程序部署到测试环境,迁移就会停止工作。

经过一番调查后,我发现 Flyway 在将迁移加载到 jar 文件时并没有定位它们,但是当它们没有被压缩时(比如当我在 Eclipse 中工作或者我将 jar 提取到类路径中时) 它按预期工作。

由于应用程序的插件架构,我无法使用“默认”设置,因此我将 Flyway 对象设置如下:

Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setBaseDir("za/co/company/application/plugin1/db/migration");
flyway.setTable(tableName);
flyway.setBasePackage("za.co.company.application.plugin1.db.migration");
flyway.init();
flyway.migrate();

如果要解压缩 jar 文件,则 sql 文件将位于: za/co/company/application/db/migration

如前所述,我知道迁移工作,只是当它们在 jar 文件中时不起作用。 上面的代码执行完美,只是没有找到作为迁移的一部分运行的 sql 文件。

虽然最初是使用 flyway-core-1.6 开发的,但我已经在 1.6.1 和 1.7_SNAPSHOT 版本中尝试过(同样的负面结果),我发现 herehere 报告了类似的问题。

编辑:附加信息

操作系统:Windows XP
JDK:1.7.0_04
数据库:SQL Server 2005
通过 bat 文件直接从命令窗口运行。

2012-06-27 15:50:05.855 main: flyway.migrate()
2012-06-27 15:50:05.886 Database: Microsoft SQL Server
2012-06-27 15:50:05.902 Schema: dbo
2012-06-27 15:50:05.902 Unable to find path for sql migrations: za\co\company\application\plugin1\db\migration
2012-06-27 15:50:05.918 Scanning URL: jar:file:/C:/Temp/lib/plugin1.jar!/za/co/company/application/plugin1/db/migration
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/ (filename: )
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/V1_1__Allows_cancelations.sql (filename: V1_1__Allows_cancelations.sql)
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/V1__Base_version.sql (filename: V1__Base_version.sql)
2012-06-27 15:50:05.933 main: done Migrate.

我已确认我使用的是默认前缀 (V) 和后缀 (.sql)。并且日志中提到的被过滤掉的迁移文件的名称确实是我想要执行的迁移。

编辑:还有更多信息。 我克隆了源存储库并在资源被记录为被过滤之前获得了堆栈跟踪。

at com.googlecode.flyway.core.util.scanner.ClassPathScanner.filterResourceNames(ClassPathScanner.java:203)
at com.googlecode.flyway.core.util.scanner.ClassPathScanner.findResourceNames(ClassPathScanner.java:136)
at com.googlecode.flyway.core.util.scanner.ClassPathScanner.scanForClasses(ClassPathScanner.java:67)
at com.googlecode.flyway.core.migration.jdbc.JdbcMigrationResolver.resolveMigrations(JdbcMigrationResolver.java:51)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:175)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:156)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:119)
at com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:565)
at com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:1)
at com.googlecode.flyway.core.Flyway.execute(Flyway.java:850)
at com.googlecode.flyway.core.Flyway.migrate(Flyway.java:561)

我已经确认迁移被过滤掉的唯一时间是当它在 jar 文件中找到它们时。就好像 .sql 迁移在 jar 文件中时甚至没有被扫描。

我还在摸索,会相应更新。

编辑:源代码查询: 我对 Flyway 源代码并不太熟悉,我只在其中研究了几个小时......

SqlMigrationResolver 类的 resolveMigrations 方法中的这段代码应该做什么?如果我从代码中删除它,SQLmigrations 会从 Jar 文件中完美加载,否则它们不会加载并记录警告。

    if (StringUtils.hasText(normalizedBaseDir)) && !new ClassPathResource(normalizedBaseDir + "/").exists() ) {
        LOG.warn("Unable to find path for sql migrations: " + location);
        return migrations;
    }

【问题讨论】:

  • 您能否发布调试日志输出并提供有关您的配置(操作系统、JDK、AppServer)的更多详细信息?谢谢。
  • 感谢您发布详细信息。我看了看,有些事情让我感到困惑:为什么“无法找到 sql 迁移的路径”消息报告带有 \ 的位置并且您的配置有 /。这是来自同一次运行吗?此外,至少选择 1.6.1,因为它修复了许多重要的错误。您能否打开一个问题,以便我们深入了解此问题?

标签: jar classpath flyway


【解决方案1】:

试试新发布的 1.7。违规言论已被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2016-10-24
    • 2018-12-28
    • 2018-12-19
    • 2019-09-10
    • 1970-01-01
    • 2013-04-07
    • 2018-08-28
    相关资源
    最近更新 更多