Osgi Flyway在Apache Karaf上找不到SQL迁移

Osgi Flyway在Apache Karaf上找不到SQL迁移,osgi,flyway,apache-karaf,Osgi,Flyway,Apache Karaf,我们正在Karaf中部署我们的应用程序,并尝试使用Flyway来处理db迁移,但它在运行时找不到我们的V_u*.sql文件。我检查过的东西: jar文件包含jar的db/migration中的sql文件 更改文件夹的名称将获得运行时异常: Caused by: org.flywaydb.core.api.FlywayException: Unable to scan for SQL migrations in location: classpath:db/migration 当我为Flywa

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

jar文件包含jar的db/migration中的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文件。我假设这是一个清单类型问题,但我不确定要查找什么。接下来的步骤是什么?

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

这可能取决于您如何捆绑Flyway

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

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

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

ClassLoader上下文=Thread.currentThread.getContextClassLoader; 试一试{ Thread.currentThread.setContextClassLoaderthis.getClass; Flyway Flyway=新的Flyway; setDataSourcejdbc:h2:file:target/foobar,sa,null; flyway.clean; flyway.migrate; } 最后{ Thread.currentThread.setContextClassLoadercontext; }
通过部署一个片段包使其工作,并且片段主机设置为org.flywaydb.core。请看一看我在上一节中列出的工作示例。该示例的灵感来源于位于的项目。

感谢Axel的快速响应。在我调试了一点之后,我将在稍后打开一个问题。我不想浪费任何人的时间,如果这只是我缺少的东西,感觉我对整个OSGI概念相当陌生。你确定有问题的文件实际上是添加到jar中的吗。如果您使用maven bundle插件构建捆绑包,您可能需要对其进行适当的配置。是的,我通过提取jar对其进行了双重检查,它们位于DB迁移路径中。在这种情况下,请尝试调试到加载资源的位置。您可能需要修补该部分,以OSGi友好的方式加载资源。是的,这就是我目前所处的位置。我正在阅读flyway文档,以便构建它并添加一些调试,以找出它到底出了什么问题。我开始怀疑在我的情况下是否加载了正确的类路径扫描程序。在这种情况下,请确保使用Bundle.getResource加载资源。