Gradle 在flyway中使用共享数据库脚本

Gradle 在flyway中使用共享数据库脚本,gradle,spring-boot,groovy,flyway,Gradle,Spring Boot,Groovy,Flyway,我有许多使用SpringBoot/Gradle用Groovy编写的项目。所有这些应用程序都为不同的客户端执行类似的工作,但共享大量功能 为了避免代码重复,我将共享组件分离到一个库中,当然,这对于Groovy代码来说很好。但是,库还包含用于创建库所依赖的模式的Flyway脚本 由于数据分离规则,为了使应用程序完全分离,每个应用程序都需要在自己的模式中有自己的数据库表副本,并且每个应用程序在自己的application.yaml中有自己的数据库连接详细信息 我无法解决的是如何在单独的项目构建中使用共

我有许多使用SpringBoot/Gradle用Groovy编写的项目。所有这些应用程序都为不同的客户端执行类似的工作,但共享大量功能

为了避免代码重复,我将共享组件分离到一个库中,当然,这对于Groovy代码来说很好。但是,库还包含用于创建库所依赖的模式的Flyway脚本

由于数据分离规则,为了使应用程序完全分离,每个应用程序都需要在自己的模式中有自己的数据库表副本,并且每个应用程序在自己的application.yaml中有自己的数据库连接详细信息

我无法解决的是如何在单独的项目构建中使用共享的Flyway脚本

我可以看到实现这一点的一种方法是,每次对适当的数据库运行库的Flyway migrate多次(每个应用程序一次),但这将涉及将所有应用程序的数据库详细信息放入库中,这也是重复

我可以看到实现这一点的另一种方法是将Flyway脚本放在应用程序项目中,但这将涉及从库中复制脚本,因此我将拥有n个副本,而不是一个副本。这将使更改变得很痛苦(如果我想将更改应用于所有或许多项目),并且还将应用程序绑定到数据库模式定义,该定义应该由库隐藏

还有其他人处理过这个问题吗?我遗漏了什么明显的东西吗?还是我只是问Flyway一些它做不到的事情


谢谢

您的常用类文件和flyway脚本是否在同一个
.jar
文件中?如果这是真的,那么您就不想让jar出现在buildscript类路径上,所以我建议将脚本提取到一个文件夹中,然后从文件系统中查找

例如:


我可能误读了,但库不是它自己的JAR吗,这样您就可以将它导入其他项目了?然后,在每个应用程序中调用一个方法,如SchemaUtil.migrate(),但没有说明这是一个多模块构建还是多个构建。如果单个多模块生成,则一个项目可以访问另一个项目的
配置。如果单独构建,您可能需要发布/使用包含sql文件的工件(jar),我的Flyway脚本是sql脚本而不是Java,因此它们不在jar中。这是一件好事吗?我想这将涉及更改库构建脚本以将sql脚本包含在jar中——但这感觉不太对(当然也不是说这样做是错误的),默认情况下,Gradle(和Maven)将把所有内容都打包在jar中的
src/main/resources
。在jar中包含非java资源是常见的做法,包括xml、sql、yaml、图像等。我的公共类文件和flyway脚本现在位于同一个.jar文件中。然后我使用locations=“classpath:…../db”,这就像我所希望的那样工作。在阅读你的帖子时,你提出了一种不同的方法,我不太明白背后的原因。。。“你不会想让jar出现在你的buildscript类路径上”你能解释一下原因吗?让类出现在buildscript类路径和编译类路径上让我觉得很肮脏。我不确定是否会有类加载问题
buildscript {
    classpath 'my.db:driver:1.0'
}
apply plugin: 'groovy'
configurations {
    flywayScripts { traisitive = false }
}
dependencies {
    compile 'com.foo:common:1.0' // assuming you also want to compile against common classes
    flywayScripts 'com.foo:common:1.0'
}
task extractFlywayScripts(type: Copy) {
    from zipTree(configurations.flywayScripts.singleFile).matching {
        include 'path/to/migration/scripts/*.xml'
    }
    into "$buildDir/flywayScripts"
}

// wire the extraction task into the DAG
flywayMigrate.dependsOn extractFlywayScripts

flyway {
    def yamlConfig = parseYaml('path/to/application.yaml') // TODO: implement parseYaml(...)
    locations = ["filesystem:$buildDir/flywayScripts", "filesystem:src/main/resources/db/migration"]
    url = yamlConfig.url
    user = yamlConfig.user
    password = yamlConfig.password

    // etc        
}