1

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

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

经过一番调查,我发现当它们被加载到 jar 文件中时,Flyway 没有找到迁移,但是当它们没有被压缩时(比如当我在 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 版本中尝试过(同样的负面结果),我在这里这里发现了类似的问题。

编辑:附加信息

操作系统:Windows XP
JDK:1.7.0_04
DB: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;
    }
4

1 回答 1

3

试试新发布的 1.7。违规声明已被删除。

于 2012-07-18T20:51:06.090 回答