Spring Boot FlywayException:无法连接到数据库。配置网址、用户和密码

2022-09-03 06:18:21

当我运行时,我收到错误maven flyway:migrate

未能在 project myProject: org.flywaydb.core.api.FlywayException: 無法執行 goal org.flywaydb:flyway-maven-plugin:6.5.5:migrate (default-cli) on project myProject: org.flywaydb.core.api.FlywayException: 無法連接到資料庫。配置网址,用户和密码!

我在 application.yml 文件中有我的 Spring Boot 设置,但我想这个错误意味着它没有检测到数据库配置。该文档说:“Spring Boot将自动将Flyway与其DataSource自动连接,并在启动时调用它。如果我在 flyway 插件部分将配置添加到我的 pom.xml,它会成功连接到数据库,但我希望它使用我的 application.yml 配置。不是绒球.xml。那么我做错了什么呢?

链接到有问题的存储库:https://github.com/jack-cole/BrokenSpringBoot

应用程序.yml

spring:
    datasource:
        driverClassName: org.postgresql.Driver
        url: "jdbc:postgresql://localhost:5433/myDB"
        username: postgres
        password: test123

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.16</version>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>7.0.0</version>
</dependency>

插件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>6.5.5</version>
</plugin>

答案 1

与专家一起运行:

未能在 project myProject: org.flywaydb.core.api.FlywayException: 無法執行 goal org.flywaydb:flyway-maven-plugin:6.5.5:migrate (default-cli) on project myProject: org.flywaydb.core.api.FlywayException: 無法連接到資料庫。配置网址,用户和密码!

您可以在 flyway-maven-plugin 配置中配置 url、用户和密码,请参阅 First Steps Maven

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>7.0.0</version>
    <configuration>
        <url>jdbc:postgresql://localhost:5433/myDB</url>
        <user>postgres</user>
        <password>test123</password>
    </configuration>
</plugin>

或使用环境变量:

mvn flyway:migrate -Dflyway.url=jdbc:postgresql://localhost:5433/myDB -Dflyway.user=postgres -Dflyway.password=test123

https://www.baeldung.com/database-migrations-with-flyway 中的更多方法

使用弹簧靴运行:

当您将 Flyway 核心库包含在项目中时,Spring Boot 会在应用程序启动时自动配置并触发 Flyway。请参阅 FlywayAutoConfiguration 中的 用法:@ConditionalOnClass(Flyway.class)

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Flyway.class)
@Conditional(FlywayDataSourceCondition.class)
@ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,
      HibernateJpaAutoConfiguration.class })
@Import({ FlywayEntityManagerFactoryDependsOnPostProcessor.class, FlywayJdbcOperationsDependsOnPostProcessor.class,
      FlywayNamedParameterJdbcOperationsDependencyConfiguration.class })
public class FlywayAutoConfiguration {
    ...
}

使用 或 运行应用程序mvn spring-boot:runjava -jar app.jar

注意:还要检查迁移脚本是否在中,否则会为位置提供属性db/migrationspring.flyway.locations

资源:

https://flywaydb.org/documentation/configuration/parameters/

https://flywaydb.org/documentation/getstarted/firststeps/maven/

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-execute-flyway-database-migrations-on-startup


答案 2

您引用了Spring Boot docs的一部分,但是您不是通过spring boot启动迁移的,而是作为maven任务启动的。

Flyway maven插件不知道弹簧启动配置,它只考虑了以下来源: 覆盖顺序

  1. 系统属性
  2. 环境变量
  3. 自定义配置文件
  4. 马文属性
  5. 插件配置部分
  6. 设置中的凭据.xml
  7. /flyway.conf
  8. Flyway Maven 插件默认值

在我的PC上,我使用了环境变量方法 - 我为构建插件和弹簧启动定义了相同的环境变量。


推荐