我在许多我支持的应用程序中实现了Flyway,它像梦一样工作。
但是,当我将应用程序部署到测试环境时,迁移就停止了。
经过一些调查后,我发现这些迁移不是由Flyway在加载到jar文件时定位的,而是当它们没有被压缩时(比如我在Eclipse中工作时,或者如果我将jar提取到类路径中时),它会像预期的那样工作。
由于应用程序的插件体系结构,我无法使用“默认”设置,因此我将天桥对象设置如下:
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/迁移
如前所述,我知道迁移是有效的,只是当它们在jar文件中时就不行了。上面的代码执行得很完美,只是没有发现任何sql文件作为迁移的一部分运行。
虽然最初是使用天桥核心-1.6开发的,但我已经尝试过(同样的负面结果),使用1.6.1和一个1.7_SNAPSHOT版本,我发现这里和这里都报告了类似的问题。
编辑:附加信息
操作系统: Windows
JDK: 1.7.0_04
DB: 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文件中时,甚至没有扫描它们。
我仍在四处闲逛,并将相应地更新。
编辑:源代码查询:-我不太熟悉天桥的源代码,我已经在里面浏览了几个小时.
在resolveMigrations类的SqlMigrationResolver方法中,这段代码应该做什么?如果我将其从代码中删除,SQLmigrations加载将完全从Jar文件中删除,如果没有,则不会加载并记录警告。
if (StringUtils.hasText(normalizedBaseDir)) && !new ClassPathResource(normalizedBaseDir + "/").exists() ) {
LOG.warn("Unable to find path for sql migrations: " + location);
return migrations;
}发布于 2012-07-18 20:51:06
尝试新发布的1.7。违规语句已被删除。
https://stackoverflow.com/questions/11226070
复制相似问题