当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring配置文件设置Flyway迁移文件位置

史谦
2023-03-14

我为开发和测试环境配置了两个Spring概要文件devtest。在每个环境中,我使用不同的数据库,即dev中的h2,以及测试中的postgresql。以下是每个配置文件的属性文件,其中{vendor}通过spring boot分别解析为h2postgresql,具体取决于配置的数据源。

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

当我使用testprofile运行我的应用程序时,它可以正常工作,它只在main/resources下选择迁移文件。然而,当我使用devprofile运行单元测试时。我希望它只能在src/test/resources/db/migration/h2下选择文件。但是Flyway正在从main/resourcestest/resources中提取迁移文件,这两个文件都会导致错误

组织。flywaydb。果心应用程序编程接口。FlywayException:找到多个版本为1的迁移

我不明白这种行为。如何解决这个问题?

共有2个答案

湛联
2023-03-14

这不仅仅是关于飞行路线。

在maven中,它在构建过程中使用两种不同的类路径:

  1. 编译类路径-用于编译(包括src/main/*

这就是为什么在运行时,实际上有两个可访问的位置,flyway可以找到多个迁移。

另一个观察:

一般来说,生产代码不应该包含任何关于测试的内容。但我看到您添加了:src/main/resources/application test。属性此文件将出现在错误的生产工件中。

作为一种解决方法,您可以使用src/main/resources/application-prod.properties,它为真正的迁移定义了位置“X”,而不是:src/test/resources/application test。定义测试迁移位置“Y”的属性运行与概要文件测试的集成测试,您将找不到生产迁移。

喻元龙
2023-03-14

下面是我是怎么做到的。

要求:

  1. 使用Spring配置文件为不同的环境配置应用程序,即devtestprod

每个环境的数据库:

  1. H2用于dev环境的数据库
  2. postgresql数据库,用于测试环境
  3. postgresql数据库,用于prod环境

配置

>

  • 在pom.xml.中创建Spring配置文件devtestprod

    为每个配置文件创建属性文件

    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迁移异常?