我有两个Spring Boot Web服务,它们必须都使用相同的数据库,相同的架构和相同的表-一个服务从表中读取数据,另一个服务向它们中写入数据。现在,其中一项服务正在开发中,并且可以与内存数据库(而不是真正的DB)一起使用,因此我可以使每个服务都包含其自己的数据库迁移副本。两种服务都在同一个数据库上运行后,将无法正常工作-第一个启动的数据库将运行其迁移,而另一个将失败。但是,这两个项目仍然必须进行迁移,因为需要它们来创建用于自动测试的内存数据库。
作为一个解决方案,我正在做第三个项目,它的唯一职责是运行迁移,两个原始应用程序都将从这个新的应用程序中进行迁移,但是我仍然坚持如何做到这一点。 / p>
与我所需要的最接近的东西是来自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'
}
答案 0 :(得分:0)
如果您正在使用Gradle多项目布局,并且希望使用Flyway插件,我想您可以直接配置迁移文件夹。像这样:
flyway {
locations = ["filesystem:$rootDir/data/migrations"]
}
如果您使用的是独立项目,则可以使用java
插件将迁移打包到jar文件中,然后将其发布到Maven存储库并对其进行正常依赖。如果您不想将迁移放在应用程序类路径上,则可以将依赖项放在自定义配置中。而且,如果您使用非标准的文件夹结构,则可以通过classpath:
参数中的locations
值进行配置。像这样:
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插件应用于所有Boot项目,然后从bootRun到flywayMigrate建立任务依赖性,来实现类似的目的。