英文:
Spring Boot FlywayException: Unable to connect to the database. Configure the url, user and password
问题
当我运行 maven flyway:migrate
时,我收到以下错误信息:
> 执行目标 org.flywaydb:flyway-maven-plugin:6.5.5:migrate 失败
> (default-cli) 在项目 myProject 上:
> org.flywaydb.core.api.FlywayException: 无法连接到数据库。请配置 url、user 和 password!
我在 application.yml 文件中配置了 Spring Boot 设置,但我猜这个错误意味着它无法检测到数据库配置。这个文档 表示,"Spring Boot 将自动使用其 DataSource 自动连接 Flyway,并在启动时调用它。" 如果我将配置添加到 pom.xml 的 flyway 插件部分,它能成功连接到数据库,但我希望它使用我的 application.yml 配置,而不是 pom.xml。那么我做错了什么?
问题仓库链接:https://github.com/jack-cole/BrokenSpringBoot
application.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>
英文:
When I run maven flyway:migrate
, I get the error
> Failed to execute goal org.flywaydb:flyway-maven-plugin:6.5.5:migrate
> (default-cli) on project myProject:
> org.flywaydb.core.api.FlywayException: Unable to connect to the
> database. Configure the url, user and password!
I have my Spring Boot settings in my application.yml file, but I guess the error means it doesn't detect the database config. This documention says, "Spring Boot will then automatically autowire Flyway with its DataSource and invoke it on startup." If I add the configuration to my pom.xml in the flyway plugin section, it connects to the database successfully, but I want it to use my application.yml config. Not the pom.xml. So what am I doing wrong?
Link to repo with issue: https://github.com/jack-cole/BrokenSpringBoot
application.yml
spring:
datasource:
driverClassName: org.postgresql.Driver
url: "jdbc:postgresql://localhost:5433/myDB"
username: postgres
password: test123
Dependencies:
<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>
Plugins:
<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
得分: 20
使用 Maven 运行:
无法执行目标 org.flywaydb:flyway-maven-plugin:6.5.5:migrate
(default-cli) 在项目 myProject 上:
org.flywaydb.core.api.FlywayException: 无法连接到数据库。 请配置 url、user 和 password!
您可以在 flyway-maven-plugin 的配置中配置 url、user 和 password,请参阅 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。请参阅 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:run
或 java -jar app.jar
来运行应用程序。
注意:还要检查迁移脚本是否位于 db/migration
,否则可以使用 spring.flyway.locations
属性提供位置。
资源:
https://flywaydb.org/documentation/configuration/parameters/
https://flywaydb.org/documentation/getstarted/firststeps/maven/
英文:
Run With maven:
> Failed to execute goal org.flywaydb:flyway-maven-plugin:6.5.5:migrate
> (default-cli) on project myProject:
> org.flywaydb.core.api.FlywayException: Unable to connect to the
> database. Configure the url, user and password!
You can configure url, user and password in flyway-maven-plugin configuration see 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>
or with environment variables:
mvn flyway:migrate -Dflyway.url=jdbc:postgresql://localhost:5433/myDB -Dflyway.user=postgres -Dflyway.password=test123
More approaches in https://www.baeldung.com/database-migrations-with-flyway
Run with spring-boot:
> Spring Boot auto configure and trigger Flyway at the application
> startup when you include the Flyway core library into the project. See
> usage of @ConditionalOnClass(Flyway.class)
in
> FlywayAutoConfiguration :
>
> @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 {
> ...
> }
Use mvn spring-boot:run
or java -jar app.jar
to run the application
NB : Check also that migration scripts are in db/migration
otherwise provide the locations with spring.flyway.locations
property
Resources:
https://flywaydb.org/documentation/configuration/parameters/
https://flywaydb.org/documentation/getstarted/firststeps/maven/
答案2
得分: 9
你引用了 Spring Boot 文档的一部分,但你的迁移不是通过 Spring Boot 启动的,而是作为 Maven 任务运行的。
Flyway Maven 插件并不了解 Spring Boot 的配置,它只考虑以下来源:覆盖顺序
- 系统属性
- 环境变量
- 自定义配置文件
- Maven 属性
- 插件配置部分
- 来自 settings.xml 的凭据
- <user-home>/flyway.conf
- Flyway Maven 插件默认值
在我的电脑上,我使用了环境变量的方法 - 对于构建插件和 Spring Boot,我定义了相同的环境变量。
英文:
You quoted a part of spring boot docs, but you launched your migration not by spring boot, but as a maven task.
Flyway maven plugin is not aware of spring boot configuration, it only takes the following sources into account: Overriding order
- System properties
- Environment variables
- Custom config files
- Maven properties
- Plugin configuration section
- Credentials from settings.xml
- <user-home>/flyway.conf
- Flyway Maven plugin defaults
On my PC, I used the environment variables approach - I have the same environment variables defined for build plugin and for spring boot.
答案3
得分: 0
如果您希望在启动应用程序时(使用spring-boot),只需移除 flyway-maven-plugin
插件,您无需它。
-- 编辑
顺便提一下,如果您运行 maven flyway:migrate
,实际上需要在插件上设置凭据(它无法访问java资源)。
- 因此,您需要运行此任务 => 您必须在
pom.xml
中的插件中设置凭据。 - 或者您不需要它,因此只需删除该插件,并在
application.yaml
文件中为应用程序启动设置凭据。
英文:
If you want Flyway to be executed when launching your app (with spring-boot), just remove the flyway-maven-plugin
plugin, you don't need it.
-- EDIT
Btw, if you run maven flyway:migrate
, you will indeed need to have the credentials set on the plugin (it isn't accessing the java resources).
- So either you need to run this task => you have to set the credentials on in the plugin on
pom.xml
. - Or you don't need it, so you just remove the plugin and set the credentials on the
application.yaml
file for your application startup
答案4
得分: 0
你试过吗?
application.yml
spring:
flyway:
driverClassName: org.postgresql.Driver
url: "jdbc:postgresql://localhost:5433/myDB"
user: postgres
password: test123
enabled: true
英文:
Have you tried?
application.yml
spring:
flyway:
driverClassName: org.postgresql.Driver
url: "jdbc:postgresql://localhost:5433/myDB"
user: postgres
password: test123
enabled: true
答案5
得分: 0
你的配置有一些遗漏的地方:
- 你在Spring Boot的
.yml
配置文件中使用了过多的空格。每个下一级应该比上一级多两个空格,像这样:
spring:
datasource:
url: jdbc:postgresql://localhost/myDB
username: postgres
password: root
不要再多加了。否则,它将无法正常工作!
如果你使用的是IntelliJ Idea,你可以使用自动格式化快捷键来格式化.yml
:<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>L</kbd>。
或者你可以使用与.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
英文:
Your configuration has a few missed moments:
- you use too many spaces for Spring Boot's
.yml
configuration file. Every next level should contain 2 more spaces, like:
spring:
datasource:
url: jdbc:postgresql://localhost/myDB
username: postgres
password: root
No more. Otherwise, it would not work!
If you using IntelliJ Idea you could use autoformat shortcut for formatting .yml
: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>L</kbd>.
Or you could use the same style as for .properties
:
spring.datasource.url: ...
spring.datasource.username: ...
More redundant. However, less chance to make it incorrect.
- you are using Spring Boot. Thus, you don't need to include the version directly.
Much better will be left to Spring's dependency management:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
And
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
</plugin>
For most cases, you could be sure that such a combination of versions will work fine.
- you should put your migration file under
resources/db/migration
. Also naming is very important. The first file should be something like:
> V1__Init_Db.sql
By default exactly two underscores after V1
-> V1__
!
Here more info: Migrations information.
- Also, check if you need additional values for your config file, like:
spring.jpa.show-sql: true
spring.jpa.hibernate.ddl-auto: create
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论