我有两个Spring Boot them服务,它们必须使用相同的数据库、相同的模式和相同的表-一个服务从表中读取,另一个服务向表中写入。现在,其中一个服务正在开发中,它使用内存中的DB而不是真正的DB,因此我可以让每个服务包含其自己的数据库迁移副本。一旦这两个服务与同一个数据库一起工作,这将无法工作-第一个启动的服务将运行其迁移,而另一个将失败。但这两个项目仍然必须进行迁移,因为需要它们来创建用于自动化测试的内存数据库。
作为一种解决方案,我正在做第三个项目,它的唯一职责是运行迁移,两个原始应用程序都会从这个新的应用程序中拉出迁移,但我被困在如何实现这一点上。
我所见过的最接近我需要的东西是来自another SO question的代码
sourceSets {
main {
resources {
srcDirs += [
project(':data').sourceSets.main.resources
]
}
}
}但这是为了包含来自另一个本地项目的资源,而不是来自gradle依赖项。我已经列出了我的私有Maven代码库,并解决了依赖关系,但我不知道该写什么,而不是上面代码块的内部行。
repositories {
mavenCentral()
maven {
url "http://my.repo.link/"
}
}
dependencies {
// other dependencies
runtime 'my.group:database-project:1.0'
}发布于 2019-09-19 19:53:00
如果你使用的是Gradle多项目布局,并且你喜欢使用Flyway插件,我想你可以直接配置迁移文件夹。如下所示:
flyway {
locations = ["filesystem:$rootDir/data/migrations"]
}如果您使用的是独立项目,则可以使用java插件将迁移打包到jar文件中,将其发布到Maven库,并对其进行常规依赖。如果您不想将迁移放在应用程序类路径上,则可以将依赖项放在自定义配置中。如果你有一个非标准的文件夹结构,你可以通过locations参数中的classpath:值来配置它。如下所示:
configurations {
flywayMigration
}
dependencies {
flywayMigration "com.group:database-project:1.0" // Jar file containing your migration scripts
}
flyway {
configurations = ["flywayMigration"]
locations = ["classpath:db/migrations"]
}除非我误解了您的要求,否则您不需要第三方项目来应用迁移。(当然,如果你愿意,你仍然可以这样做。)在我的项目中,我们处于类似的情况,我们让所有的Spring Boot应用程序将迁移脚本与它们捆绑在一起,然后在启动时,我们有问题地将迁移应用于数据库。在此场景中,在一个干净的数据库上,第一个应用程序将执行所有迁移,所有后续应用程序将只验证一切正常。Flyway也支持并行迁移,所以应该不会有任何并发问题。您可以通过将Flyway插件应用于所有引导项目来实现类似的操作,然后将任务从bootRun依赖到flywayMigrate。
https://stackoverflow.com/questions/58006651
复制相似问题