Gradle 和 Flyway:无法获取资源的输入流
Gradle and Flyway: Unable to obtain inputstream for resource
我有一个问题,在 Gradle 项目中使用 Flyway 的 migrateDb 有时会导致
Unable to obtain inputstream for resource: META-INF/db/mysql/V1__script.sql
此错误不会一直发生,只是有时会发生,但如果发生,它会持续存在,而且项目的 clean/rebuild 也无法解决它。
提到的 SQL 脚本包含在一个 JAR 文件中,该文件作为多模块项目的一部分从项目中引用。
我的研究只把我带到 https://github.com/flyway/flyway/issues/702 但这并没有把我引向正确的道路。
我也很困惑,flyway 能够在类路径搜索期间找到文件,但随后无法获取输入流。
如果您需要任何进一步的信息,请询问。
进一步调试: 似乎错误似乎是在将新文件添加到 DB JAR 时立即发生的。重建和 migrateDb 后发生错误。如果我再次删除脚本,尽管脚本不再位于生成的 JAR 中,但错误仍然存在。所以我想搜索脚本和检索输入流的类路径是不同的。有人知道可能存在哪些差异吗?
完整的堆栈跟踪:
Caused by: org.flywaydb.core.api.FlywayException: Unable to obtain inputstream for resource: META-INF/db/mysql/V1__script.sql
at org.flywaydb.core.internal.util.scanner.classpath.ClassPathResource.loadAsString(ClassPathResource.java:84)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.scanForMigrations(SqlMigrationResolver.java:139)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:99)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:49)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:122)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:104)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:90)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:43)
at org.flywaydb.core.internal.info.MigrationInfoServiceImpl.refresh(MigrationInfoServiceImpl.java:114)
at org.flywaydb.core.internal.command.DbValidate.call(DbValidate.java:164)
at org.flywaydb.core.internal.command.DbValidate.call(DbValidate.java:157)
at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:75)
at org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:157)
at org.flywaydb.core.Flyway.doValidate(Flyway.java:1280)
at org.flywaydb.core.Flyway.access0(Flyway.java:71)
at org.flywaydb.core.Flyway.execute(Flyway.java:1176)
at org.flywaydb.core.Flyway.execute(Flyway.java:1168)
at org.flywaydb.core.Flyway.execute(Flyway.java:1650)
at org.flywaydb.core.Flyway.migrate(Flyway.java:1168)
at org.flywaydb.gradle.task.FlywayMigrateTask.run(FlywayMigrateTask.java:28)
at org.flywaydb.gradle.task.AbstractFlywayTask.runTask(AbstractFlywayTask.java:382)
Gradle 任务:
// task that migrates the database
task migrateDb(type: org.flywaydb.gradle.task.FlywayMigrateTask) {
// parse hibernate config
def hibernateConfig = parseHibernateConfigByStageParameter()
// set config
url = hibernateConfig.url
driver = hibernateConfig.driver
user = hibernateConfig.username
password = hibernateConfig.password
locations = [ "classpath:${flywayDbPath}/${hibernateConfig.dbType}" ]
table = 'schema_version'
outOfOrder = true
ignoreMissingMigrations = true
}
Gradle依赖性:
// dependencies
dependencies {
[...]
runtime project(':core:db:mysql')
[...]
}
在进一步测试过程中,我注意到错误似乎是由于 Gradle 守护进程造成的。将 --no-daemon
添加到 migrateDb 调用工作正常,不会触发错误。
目前对我来说没问题。
事实证明,我正在部署旧的 .war,它是用一些不再存在的 .sql 文件构建的。
然后我通过 运行 gradlew clean build
解决了这个问题
我有一个问题,在 Gradle 项目中使用 Flyway 的 migrateDb 有时会导致
Unable to obtain inputstream for resource: META-INF/db/mysql/V1__script.sql
此错误不会一直发生,只是有时会发生,但如果发生,它会持续存在,而且项目的 clean/rebuild 也无法解决它。
提到的 SQL 脚本包含在一个 JAR 文件中,该文件作为多模块项目的一部分从项目中引用。
我的研究只把我带到 https://github.com/flyway/flyway/issues/702 但这并没有把我引向正确的道路。
我也很困惑,flyway 能够在类路径搜索期间找到文件,但随后无法获取输入流。
如果您需要任何进一步的信息,请询问。
进一步调试: 似乎错误似乎是在将新文件添加到 DB JAR 时立即发生的。重建和 migrateDb 后发生错误。如果我再次删除脚本,尽管脚本不再位于生成的 JAR 中,但错误仍然存在。所以我想搜索脚本和检索输入流的类路径是不同的。有人知道可能存在哪些差异吗?
完整的堆栈跟踪:
Caused by: org.flywaydb.core.api.FlywayException: Unable to obtain inputstream for resource: META-INF/db/mysql/V1__script.sql
at org.flywaydb.core.internal.util.scanner.classpath.ClassPathResource.loadAsString(ClassPathResource.java:84)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.scanForMigrations(SqlMigrationResolver.java:139)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:99)
at org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:49)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:122)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:104)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:90)
at org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:43)
at org.flywaydb.core.internal.info.MigrationInfoServiceImpl.refresh(MigrationInfoServiceImpl.java:114)
at org.flywaydb.core.internal.command.DbValidate.call(DbValidate.java:164)
at org.flywaydb.core.internal.command.DbValidate.call(DbValidate.java:157)
at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:75)
at org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:157)
at org.flywaydb.core.Flyway.doValidate(Flyway.java:1280)
at org.flywaydb.core.Flyway.access0(Flyway.java:71)
at org.flywaydb.core.Flyway.execute(Flyway.java:1176)
at org.flywaydb.core.Flyway.execute(Flyway.java:1168)
at org.flywaydb.core.Flyway.execute(Flyway.java:1650)
at org.flywaydb.core.Flyway.migrate(Flyway.java:1168)
at org.flywaydb.gradle.task.FlywayMigrateTask.run(FlywayMigrateTask.java:28)
at org.flywaydb.gradle.task.AbstractFlywayTask.runTask(AbstractFlywayTask.java:382)
Gradle 任务:
// task that migrates the database
task migrateDb(type: org.flywaydb.gradle.task.FlywayMigrateTask) {
// parse hibernate config
def hibernateConfig = parseHibernateConfigByStageParameter()
// set config
url = hibernateConfig.url
driver = hibernateConfig.driver
user = hibernateConfig.username
password = hibernateConfig.password
locations = [ "classpath:${flywayDbPath}/${hibernateConfig.dbType}" ]
table = 'schema_version'
outOfOrder = true
ignoreMissingMigrations = true
}
Gradle依赖性:
// dependencies
dependencies {
[...]
runtime project(':core:db:mysql')
[...]
}
在进一步测试过程中,我注意到错误似乎是由于 Gradle 守护进程造成的。将 --no-daemon
添加到 migrateDb 调用工作正常,不会触发错误。
目前对我来说没问题。
事实证明,我正在部署旧的 .war,它是用一些不再存在的 .sql 文件构建的。
然后我通过 运行 gradlew clean build