Flyway在jar文件中找不到迁移

Flyway在jar文件中找不到迁移,jar,classpath,flyway,Jar,Classpath,Flyway,我在我支持的许多应用程序中实现了Flyway,它工作起来就像做梦一样 但是,当我将应用程序部署到测试环境时,迁移就停止了 经过一些调查,我发现当迁移被加载到jar文件中时,它们不是通过Flyway定位的,而是当它们没有被压缩时(比如当我在Eclipse中工作时,或者如果我将jar解压到类路径中),它会按预期工作 由于应用程序的插件架构,我无法使用“默认”设置,因此我将Flyway对象设置为: Flyway flyway = new Flyway(); flyway.setDataSource(d

我在我支持的许多应用程序中实现了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_快照版本中尝试过了(同样的负面结果),我发现了类似的问题

编辑:其他信息

操作系统: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;
    }

试试新发布的1.7。有问题的语句已被删除。

能否发布调试日志输出,并提供有关配置(OS、JDK、AppServer)的更多详细信息?谢谢你发布详细信息。我看了一下,有件事让我困惑:为什么“找不到sql迁移的路径”消息会报告一个位置为\并且您的配置为/。这是同一批货吗?另外,请至少选择1.6.1,因为它修复了一些重要的bug。你能打开一个问题,让我们了解这个问题的真相吗?