簡體   English   中英

Spring Boot FlywayException:無法連接到數據庫。 配置url、用戶和密碼

[英]Spring Boot FlywayException: Unable to connect to the database. Configure the url, user and password

當我運行maven flyway:migrate ,出現錯誤

無法在項目 myProject 上執行目標 org.flywaydb:flyway-maven-plugin:6.5.5:migrate (default-cli): org.flywaydb.core.api.FlywayException: 無法連接到數據庫。 配置url,用戶和密碼!

我的 application.yml 文件中有我的 Spring Boot 設置,但我猜這個錯誤意味着它沒有檢測到數據庫配置。 該文檔說,“然后,Spring Boot 將使用其數據源自動裝配 Flyway,並在啟動時調用它。” 如果我將配置添加到我的 pom.xml 中的 flyway 插件部分,它會成功連接到數據庫,但我希望它使用我的 application.yml 配置。 不是 pom.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>

使用 Maven 運行:

無法在項目 myProject 上執行目標 org.flywaydb:flyway-maven-plugin:6.5.5:migrate (default-cli): org.flywaydb.core.api.FlywayException: 無法連接到數據庫。 配置url,用戶和密碼!

您可以在 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 中的更多方法

使用 spring-boot 運行:

當您將 Flyway 核心庫包含到項目中時,Spring Boot 會在應用程序啟動時自動配置和觸發 Flyway。 查看@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/migration否則提供帶有spring.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

您引用了 spring boot 文檔的一部分,但是您不是通過 spring boot 而是作為 maven 任務啟動了遷移。

Flyway maven 插件不知道 spring boot 配置,它只考慮以下來源:覆蓋順序

  1. 系統屬性
  2. 環境變量
  3. 自定義配置文件
  4. Maven 屬性
  5. 插件配置部分
  6. 來自 settings.xml 的憑據
  7. /flyway.conf
  8. Flyway Maven 插件默認值

在我的 PC 上,我使用了環境變量方法 - 我為構建插件和 Spring Boot 定義了相同的環境變量。

如果您希望在啟動應用程序時執行 Flyway(使用 spring-boot),只需刪除flyway-maven-plugin插件,您不需要它。

- 編輯

順便說一句,如果您運行maven flyway:migrate ,您確實需要在插件上設置憑據(它不訪問 java 資源)。

  • 因此,要么您需要運行此任務 => 您必須在pom.xml的插件中設置憑據。
  • 或者你不需要它,所以你只需刪除插件並在application.yaml文件上設置憑據以啟動應用程序

你有沒有嘗試過?

應用程序.yml

spring:
    flyway:
        driverClassName: org.postgresql.Driver
        url: "jdbc:postgresql://localhost:5433/myDB"
        user: postgres
        password: test123
        enabled: true

您的配置有一些錯過的時刻:

  • 您為 Spring Boot 的.yml配置文件使用了太多空格。 每個下一層都應該包含 2 個以上的空格,例如:
spring:
  datasource:
    url: jdbc:postgresql://localhost/myDB
    username: postgres
    password: root

不再。 否則,它不會工作!

如果您使用 IntelliJ Idea,您可以使用自動格式化快捷方式來格式化.ymlCtrl + Alt + L

或者您可以使用與.properties相同的樣式:

spring.datasource.url: ...
spring.datasource.username: ...

比較多余。 但是,使其不正確的機會較少。

  • 您正在使用 Spring Boot。 因此,您不需要直接包含版本。
    將更好的留給 Spring 的依賴管理:
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
</plugin>

在大多數情況下,您可以確定這樣的版本組合會正常工作。

  • 您應該將遷移文件放在resources/db/migration 另外命名也很重要。 第一個文件應該是這樣的:

V1__Init_Db.sql

默認情況下,在V1 -> V1__之后正好有兩個下划線!

這里有更多信息:遷移信息

  • 另外,檢查您的配置文件是否需要其他值,例如:
spring.jpa.show-sql: true
spring.jpa.hibernate.ddl-auto: create

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM