我在我支持的许多应用程序中实现了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/迁移
正如前面提到的,我知道迁移是有效的,只是当它们在jar文件中时就不行了。上面的代码执行得非常完美,只是没有找到作为迁移一部分运行的sql文件。
虽然最初是使用flyway-core-1.6开发的,但我已经尝试了1.6.1和1.7_SNAPSHOT版本(有同样的负面结果),我在这里和这里发现了类似的问题。
编辑:附加信息
OS: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。冒犯性的陈述已被删除。
我有一个使用Flyway迁移的Spring Boot应用程序。一切正常,从: Intellij内部 从MacBook上的终端 使用“fine”,我的意思是找到迁移文件,这些文件被放置在src/main/resources中,并最终被放置在Spring Boot可执行JAR中。 但是,当我在CentOS6.8上从命令行运行jar时,Flyway无法找到迁移文件。 使用Java8。
我们正在Karaf中部署我们的应用程序,并试图使用Flyway来处理数据库迁移,但它在运行时找不到我们的文件。我检查过的东西: > 当我为Flyway启用调试时,我可以看到它在类路径上找到了文件夹,但其中没有文件。 当408与安装的捆绑包匹配时,日志显示它正在查找正确的捆绑包。 我不确定还要查找什么,因为没有记录任何错误,而且它似乎正在查找它应该位于的文件夹,而不是sql文件。我假设这是一个清单类
是否有可能从maven flyway插件的罐子迁移?我对sqls和java(编译到类)没有问题,但对jars没有成功。类路径设置正确。
我正在使用Flyway从Clojure内部进行数据库迁移。我遇到的问题是,当我制作一个uberjar来部署我的应用程序时,Flyway找不到jar文件中的迁移。它在开发中运行良好,无需打包应用程序。我尝试了一系列不同的组合来将迁移sql文件添加到jar中。我已经解压缩了jar,所有的迁移都在那里,我不确定问题是什么。 我使用的是flyway版本2.1.1,现在我的迁移是src/db/migrati
我有一个类似的问题,但我已经迁移到版本2.1.1和问题仍然在这里。我就是做那样的事 这并没有问题,因为在我的IDE中所有工作都很好,但当我在jar中打包时,并没有找到我的迁移。。。有什么想法吗? 编辑:我已经测试过将包含迁移的jar放在一个测试应用程序的依赖项中,该测试应用程序刚刚迁移,并且迁移应用良好。。。我不知道我能做什么。 编辑我已经启用了最好的日志记录,现在可以找到迁移
我已经尝试了几种方法(谷歌,堆栈溢出…)和几天解决以下错误没有成功。只有在运行应用程序时才会发生此错误。编译不受影响。 org.databene.commons。配置错误:未找到类:“org.databene.benerator.engine”。DefaultBeneratorFactory'位于org.databene.commons.ExceptionMapper.configurationE