当前位置: 首页 > 知识库问答 >
问题:

Flyway在Apache Karaf上找不到SQL迁移

姚自强
2023-03-14

我们正在Karaf中部署我们的应用程序,并试图使用Flyway来处理数据库迁移,但它在运行时找不到我们的V#__*. sql文件。我检查过的东西:

>

Caused by: org.flywaydb.core.api.FlywayException: 
Unable to scan for SQL migrations in location: classpath:db/migration

当我为Flyway启用调试时,我可以看到它在类路径上找到了文件夹,但其中没有文件。

DEBUG|org.flywaydb.core.Flyway|408-org.flywaydb.core-3.2.1|DDL Transactions Supported: true
DEBUG|org.flywaydb.core.Flyway|408-org.flywaydb.core-3.2.1|Schema: my_database
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning for classpath resources at 'db/migration' (Prefix: '', Suffix: '.sql')
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning URL: bundle://418.0:1/db/migration
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v2 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v3 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|OSGi framework available: true
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|Spring Jdbc available: false
DEBUG|org.flywaydb.core.internal.command.DbValidate|408-org.flywaydb.core-3.2.1|Validating migrations ...
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning for classpath resources at 'db/migration' (Prefix: 'V', Suffix: '.sql')
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning URL: bundle://418.0:1/db/migration
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v2 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v3 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|OSGi framework available: true
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning for classes at 'db/migration' (Implementing: 'org.flywaydb.core.api.migration.jdbc.JdbcMigration')
DEBUG|org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner|408-org.flywaydb.core-3.2.1|Scanning URL: bundle://418.0:1/db/migration
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v2 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|JBoss VFS v3 available: false
DEBUG|org.flywaydb.core.internal.util.FeatureDetector|408-org.flywaydb.core-3.2.1|OSGi framework available: true
INFO|org.flywaydb.core.internal.command.DbValidate|408-org.flywaydb.core-3.2.1|Validated 0 migrations (execution time 00:00.010s)
DEBUG|org.flywaydb.core.internal.command.DbSchemas|408-org.flywaydb.core-3.2.1|Schema "my_database" already exists. Skipping schema creation.
DEBUG|org.flywaydb.core.internal.dbsupport.Table|408-org.flywaydb.core-3.2.1|Locking table "my_database"."schema_version"...
DEBUG|org.flywaydb.core.internal.dbsupport.Table|408-org.flywaydb.core-3.2.1|Lock acquired for table "my_database"."schema_version"
INFO|org.flywaydb.core.internal.command.DbMigrate|408-org.flywaydb.core-3.2.1|Current version of schema "my_database": << Empty Schema >>
INFO|org.flywaydb.core.internal.command.DbMigrate|408-org.flywaydb.core-3.2.1|Schema "my_database" is up to date. No migration necessary.

当408与安装的捆绑包匹配时,日志显示它正在查找正确的捆绑包。

我不确定还要查找什么,因为没有记录任何错误,而且它似乎正在查找它应该位于的文件夹,而不是sql文件。我假设这是一个清单类型问题,但我不确定要查找什么。接下来的步骤是什么?

共有3个答案

仲孙华奥
2023-03-14

通过部署一个片段包使其工作,并且片段主机被设置为org。flywaydb。果心请看一看我在https://github.com/barryku/karaf-flyway-demo.这个例子的灵感来自于https://github.com/FlavioF/fabric8-osgi-flyway-example/tree/master/fabric8-osgi-flyway.

权烨磊
2023-03-14

这可能取决于你如何捆绑Flyway。

如果您将它嵌入到与迁移脚本相同的包中,它应该可以正常工作。

但是,如果您将flyway作为一个独立的包,则需要让它知道哪个类加载器包含资源。

一种技术是从包中包含迁移资源的类执行以下操作。

ClassLoader context = Thread.currentThread().getContextClassLoader();

try {
    Thread.currentThread().setContextClassLoader(this.getClass());

    Flyway flyway = new Flyway();
    flyway.setDataSource("jdbc:h2:file:target/foobar", "sa", null);
    flyway.clean();
    flyway.migrate();
}
finally {
    Thread.currentThread().setContextClassLoader(context);
}
杨晓博
2023-03-14

OSGi和类路径扫描是一件棘手的事情,似乎在每个容器中的工作方式都不同。请在问题跟踪程序中提交问题。拉请求也欢迎。

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

  • 我在我的项目中设置了具有以下目录布局的Flyway(不包括不相关的目录): 和build.xml的相关部分(flyway.url和flyway.driver设置在不包括在这里的属性文件中---Flyway与数据库交谈没有问题): 以下是在编译目标中创建的迁移JAR的布局: 下面是来自的输出: Flyway没有发现问题。类文件。我做错了什么? 编辑:如果有人知道使用Ant(没有Maven,没有常春藤

  • 我正在使用Flyway从Clojure内部进行数据库迁移。我遇到的问题是,当我制作一个uberjar来部署我的应用程序时,Flyway找不到jar文件中的迁移。它在开发中运行良好,无需打包应用程序。我尝试了一系列不同的组合来将迁移sql文件添加到jar中。我已经解压缩了jar,所有的迁移都在那里,我不确定问题是什么。 我使用的是flyway版本2.1.1,现在我的迁移是src/db/migrati

  • 编辑:我可以从flyway命令行工具运行相同的配置,但不能从ant任务运行。 我有一个flyway配置,可以在我的oracle数据库上运行。我正在SQL Server数据库上设置flyway。当我尝试任何蚂蚁任务时,Flyway会挂起。包括用于测试与数据库连接的信息。 当我运行Flyway时,它似乎挂起来了。当执行任何ant任务时,详细日志将以“[flyway:info]DDL Transacti

  • 当我从命令行运行我的使用Flyway的Spring Boot·科特林应用程序时,它似乎可以工作,但从IntelliJ运行时却失败了。我创建了一个复制这个问题的最小样本项目:https://github.com/pupeno/notflying 我从IntelliJ得到的错误是没有找到迁移: 据我所知,迁移就在那里,并且命名正确: 运行它的IntelliJ配置如下所示: 我补充说: to 和尝试从

  • 我使用SpringBoot2.2.0.m2/Flyway5.2.4/Java8创建了一个新项目。在尝试开始我的项目后,我得到了: 我在db/migration下有一个init sql,名称为:(其中只有一行:) yml中的flyway配置(忽略其他数据源): 我试着调试它,发现总是返回false,这意味着没有找到位置(但在调试器中看起来是正确的),见下面的截图: 感谢任何善意的帮助:)