我为开发和测试环境配置了两个Spring概要文件dev
和test
。在每个环境中,我使用不同的数据库,即dev中的h2
,以及测试中的postgresql
。以下是每个配置文件的属性文件,其中{vendor}
通过spring boot分别解析为h2
和postgresql
,具体取决于配置的数据源。
application-dev.properties
spring.flyway.locations=classpath:db/migration/{vendor}
application-test.properties
#Data source
spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
#Flyway
spring.flyway.check-location=false
spring.flyway.locations=classpath:/db/migration/test/{vendor}
dev
配置文件的Flyway迁移文件位于test/resources
下,而test
配置文件位于main/resources
当我使用test
profile运行我的应用程序时,它可以正常工作,它只在main/resources
下选择迁移文件。然而,当我使用dev
profile运行单元测试时。我希望它只能在src/test/resources/db/migration/h2
下选择文件。但是Flyway正在从main/resources
和test/resources
中提取迁移文件,这两个文件都会导致错误
组织。flywaydb。果心应用程序编程接口。FlywayException:找到多个版本为1的迁移
我不明白这种行为。如何解决这个问题?
这不仅仅是关于飞行路线。
在maven中,它在构建过程中使用两种不同的类路径:
src/main/*
)这就是为什么在运行时,实际上有两个可访问的位置,flyway可以找到多个迁移。
另一个观察:
一般来说,生产代码不应该包含任何关于测试的内容。但我看到您添加了:src/main/resources/application test。属性
此文件将出现在错误的生产工件中。
作为一种解决方法,您可以使用src/main/resources/application-prod.properties
,它为真正的迁移定义了位置“X”,而不是:src/test/resources/application test。定义测试迁移位置“Y”的属性运行与概要文件测试的集成测试,您将找不到生产迁移。
下面是我是怎么做到的。
要求:
dev
、test
和prod
每个环境的数据库:
H2
用于dev
环境的数据库
postgresql
数据库,用于测试
环境
postgresql
数据库,用于prod
环境
配置
>
在pom.xml.中创建Spring配置文件dev
,test
和prod
为每个配置文件创建属性文件
application-dev.properties
spring.flyway.locations=classpath:db/migration/{vendor}
因为,当H2驱动程序在类路径上时,
H2
数据库由Spring boot配置。我们不需要显式地配置它。
application-test.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/db_test
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.flyway.locations=/db/{vendor}/common,/db/{vendor}/test
application-prod.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/db_prod
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.flyway.locations=/db/{vendor}/common,/db/{vendor}/prod
如果您注意到,我没有在
src/main/resources
下使用db/migration
来放置迁移文件,这是默认位置。原因很简单,Flyway会拾取此位置下的所有文件,这会导致不同环境下的文件之间存在版本冲突。例如V2\u数据\u插入。sql
适用于所有三种环境,如果这些环境嵌套在db/migration
下,这将不起作用。因为,H2
迁移文件属于默认配置文件,所以我将它们保留在默认的flyway迁移文件位置。
希望有帮助!!!
问题内容: 我有一个使用maven作为构建工具的应用程序。 我正在使用Maven配置文件从不同的配置文件设置不同的属性。 我想做的是将maven中的所有活动配置文件也移植到spring活动配置文件中,以便我可以在bean签名()中引用它们。但我不确定该怎么做。 例如:考虑以下Maven设置 假设我在未指定任何其他配置文件的情况下运行maven,而我希望spring具有和 配置为活动配置文件。 问题
我有一个用maven作为构建工具的应用程序。 我正在使用maven概要文件从不同的概要文件设置不同的属性。 假设我运行带有out的maven,并指定我希望spring的任何其他概要文件,将和作为活动概要文件。
问题内容: 我正在尝试根据某个Maven配置文件是否处于活动状态来使用数据库信息配置Spring配置文件。我已经看到了一些答案,但是很难将它们放在一起。 我有一个这样的Maven个人资料: 还有一个settings.xml文件,如下所示: 并在servlet-context.xml中: 我的问题基本上是,如何将Maven属性放入servlet- context.xml文件中?我需要一个.prope
问题内容: 我想使用带有以下条目的application.properties文件设置配置文件: 如何在我的context.xml文件中设置spring.profiles.active?init-param仅在web.xml上下文中有效。 问题答案: 有几种更改活动配置文件的方法,这些方法都不直接取自属性文件。 您可以像在问题中一样使用。 您可以在应用程序启动时提供系统参数 你可以得到从你和编程方
我有两个环境来设置我的API,所以我有生产和开发。我首先需要的是找到一种方法来自动完成这一任务,例如,在运行时,不发送任何参数(-d)应用程序找到了一种方法来识别环境,但我没有找到任何方法来完成这一任务。 所以我看了一个教程,在同样有一个方法放了一个环境变量,并定义了我的application.properties。所以在下面的步骤中: > 我在我的应用程序中定义了3个文件,application
我需要重命名一个Flyway迁移文件。我已经在本地数据库上应用了迁移。 如何删除或重置本地postgres数据库,使其不存在Flyway迁移异常?