我实现了迁飞在许多应用中,我支持和它的工作就像一个梦。
但是当我部署的应用程序的测试环境中的迁移停止工作。
经过一番调查,我发现,该迁移不被位于由迁飞时,他们被加载到一个jar文件,但是当他们没有拉上(当我在Eclipse或者,如果我的工作就像我解压的jar到classpath中),它的工作原理如预期。
由于我在使用“默认”设置的位置,因此我设置迁飞反对这个样子我不是应用程序的插件架构:
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 /公司/应用/数据库/迁移
如前所述,我知道的迁移工作,只是没有当他们在jar文件。 上面的代码执行完美,它只是有发现,作为迁移的一部分运行没有SQL文件。
虽然使用的渊源迁徙路线核-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文件中。
我仍然关注着,并会相应地更新。
编辑:源代码查询:我不是太熟悉的迁徙路线的源代码,我一直关注着在它只有几个小时...
这是什么一段代码中应该做的SqlMigrationResolver类的resolveMigrations方法? 如果我从代码中删除该SQLmigrations从Jar文件加载完美,如果不是他们不加载,并记录警告。
if (StringUtils.hasText(normalizedBaseDir)) && !new ClassPathResource(normalizedBaseDir + "/").exists() ) {
LOG.warn("Unable to find path for sql migrations: " + location);
return migrations;
}