Spring Boot Application is not running Flyway migrations on startup
Asked Answered
E

15

16

I have a Spring Boot Application with a couple Entity classes and I'm trying to implement database migrations with flyway. It appears that, on startup, Spring Boot is not running flyway at all.

Here is my application.properties

spring.datasource.url= jdbc:postgresql://localhost:5555/mfidb
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.hibernate.ddl-auto=validate

spring.flyway.enabled=true

Here are the lines in my build.gradle that have something to do with flyway

plugins {
    id 'org.springframework.boot' version '2.2.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id "org.flywaydb.flyway" version "6.4.1"
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'    
    implementation 'org.flywaydb:flyway-core'
    runtime('org.postgresql:postgresql:42.2.12')
}

flyway {
    url = 'jdbc:postgresql://localhost:5555/mfidb'
    user = 'postgres'
    password = 'postgres'
}

I am able to run my migrations by entering gradle flywayMigrate -i in the terminal.

But I want the migrations to run on startup.

Any help would be greatly appreciated, thanks in advance.

EDIT:

Here is the console output when running the application

2020-05-05 11:55:59.022  INFO 50754 --- [           main] com.ubm.mfi.MfiApplication               : Starting MfiApplication on MacBook-Pro.local with PID 50754 (~/Downloads/mfi 5/build/classes/java/main started by will in ~/Downloads/mfi 5)
2020-05-05 11:55:59.024  INFO 50754 --- [           main] com.ubm.mfi.MfiApplication               : No active profile set, falling back to default profiles: default
2020-05-05 11:55:59.457  INFO 50754 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-05-05 11:55:59.495  INFO 50754 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 33ms. Found 2 JPA repository interfaces.
2020-05-05 11:55:59.778  INFO 50754 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-05-05 11:55:59.783  INFO 50754 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-05-05 11:55:59.784  INFO 50754 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-05-05 11:55:59.838  INFO 50754 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-05-05 11:55:59.838  INFO 50754 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 768 ms
2020-05-05 11:55:59.917  INFO 50754 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-05-05 11:55:59.944  INFO 50754 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
2020-05-05 11:55:59.991  INFO 50754 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-05-05 11:56:00.051  INFO 50754 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-05-05 11:56:00.114  INFO 50754 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-05-05 11:56:00.124  INFO 50754 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect
2020-05-05 11:56:00.545  INFO 50754 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-05-05 11:56:00.548  INFO 50754 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-05-05 11:56:00.818  WARN 50754 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2020-05-05 11:56:00.891  INFO 50754 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-05-05 11:56:01.005  INFO 50754 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-05 11:56:01.007  INFO 50754 --- [           main] com.ubm.mfi.MfiApplication               : Started MfiApplication in 2.255 seconds (JVM running for 2.983)

Here is the path to the data migrations

enter image description here

Enrichetta answered 5/5, 2020 at 17:53 Comment(8)
Can you also show where the migration scripts are kept in your project structure and what is the output you are getting in the console?Glorification
Added the running output on startup and image for path to migrationsEnrichetta
Can you try by adding spring.flyway.locations=classpath:/db/migration in property fileGlorification
Didn't fix it @JiteshShivnaniEnrichetta
Although @JiteshShivnani, I did turn logging on and got this error FlywayAutoConfiguration: Did not match: - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition), but it is in my build.gradleEnrichetta
Can you try comparing gradle file with github.com/helloworlde/SpringBootCollection/blob/master/….Glorification
Any Luck Here @WillHarrisonEssay
@geek, My configurations and structure was right, My dependencies weren't refreshing so the flyway dependencies were never pulled down. I was able to discover this was the problem using the logging tip in the selected answer below. I had to tell it to manually refresh my gradle dependencies to download the flyway classesEnrichetta
L
16

Add logging.level.root=debug your application.properties file to see detailed information during start application.

Also just add flyway user and password to application.properties.

spring.flyway.url = 'jdbc:postgresql://localhost:5555/mfidb'
spring.flyway.password=postgres
spring.flyway.user=postgres

if you dont need to run flyway from gradle, you can remove flyway config from build.gradle

Languish answered 5/5, 2020 at 18:12 Comment(5)
This didn't fix it, but i turned logging on and I'm getting this FlywayAutoConfiguration: Did not match: - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition) But it is there: implementation 'org.flywaydb:flyway-core'Enrichetta
Try clean and buildLanguish
It's still not seeing it. Is there something else I need to do to add it to the classpath or something like that?Enrichetta
I guess my dependencies weren't refreshing when doing a gradle clean build, so it never pulled the flyway dependencies. I had to manually tell it to refresh dependencies and that fixed it. Thanks for the logging level tip, that's what helped my find the solution.Enrichetta
It's not clear in the documentation what kind of URL the spring.flyway.url property accepts and I found it was only possible to make it work with a separate property/value for user name and password (rather than part of the URL)Ferrel
E
7

My dependencies weren't getting refreshed when i did a gradle clean build so the flyway source was never there. I had to manually refresh my dependencies in my IDE and it started working. Sad when you spend hours on something so simple. Giga's comment to change the logging level helped me to find the issue. Thanks

Enrichetta answered 5/5, 2020 at 23:53 Comment(0)
G
4

In my case it, was a missing character in the filename of the flyway init script.

  • Bad-Filename: V1_init.sql
  • Good-Filename: V1__init.sql (double '_')

I was missing an underscore in the filename, it needs 2 instead of 1.

Using spring-boot 2.6.7, my application.properties

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=validate    # or 'none'

Resource-Folder

src/main/resources
- db/migration
    - V1__init.sql

Example of V1__init.sql

create sequence hibernate_sequence start with 1 increment by 1;
CREATE TABLE person
(
    id   INT NOT NULL,
    name VARCHAR(255),
    age  INT,
    CONSTRAINT pk_person PRIMARY KEY (id)
);

Described correctly in the spring docs, but I recognised too late

Graphemics answered 17/5, 2022 at 23:36 Comment(0)
P
2

Your application.properties looks perfect to me.

I am using Flyway as well, it works like a charm and executes migrations on startup of my application. The only entry in my build.gradle related to flyway is the dependency

runtime("org.flywaydb:flyway-core")

I think you should remove all other flyway related entries from build.gradle.

Printer answered 5/5, 2020 at 21:27 Comment(1)
In Kotlin DSL it would be: implementation("org.flywaydb:flyway-core:{version}")Bentinck
E
2

In my case this is what happened:

I spent almost 4 hours to figure this out, My assumption was Spring JPA starter bring the flyway core dependency along with it. I didn't add the dependency for flyway-core explicitly. So if we dont do it spring boot flyway auto configuration will not give any error but just simply ignore the migration setup.

By tracing the auto configuration I figured out this, auto configuration ignoring the flyway setup if dependency not added manually rather than throwing exception using conditional annotation like this @ConditionalOnMissingBean({Flyway.class})

Essay answered 7/1, 2021 at 6:10 Comment(3)
Did you add that to Application.java?Enrichetta
I didnt ad anything in the Application.java, Just added the flyway-core dependency into my pom.xml. spring jpa starter does not bring that dependency, i thought that was the case.Essay
in my case, the accidental exclusion of DataSourceAutoConfiguration in Application.java ignore any migrations.Eclipse
D
2

Check if your script already run.

The trick is, once Flyway has succeeded in running the update script, it has created the table flyway_schema_history, that recorded that I have already run the create script successfully once.

When I tried to run the script second time, that was rejected but since the originally created table (in my case called 'bike') was deleted when the app shut down when run in spring.jpa.hibernate.ddl-auto=create-drop mode previous time, I was getting the

SchemaManagementException: Schema-validation: missing table [bike] Exception.

drop the flyway_schema_history table or delete a record corresponding to previous script run and roll again!

Dread answered 19/3, 2021 at 11:19 Comment(1)
that was my case also, thank you for the responseSeiber
N
1

After checking the SQL manually, here's what worked for me (using Spring Boot + Cloud):

important part in my build.gradle:

  implementation  'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation  'org.flywaydb:flyway-core'
  implementation  'org.hibernate:hibernate-core'
  implementation  'org.hibernate.validator:hibernate-validator:7.0.1.Final'

no gradle plugins. And in application.yml / application-local.yml:

spring:
  flyway:
    baseline-on-migrate: true

  jpa:
    database: POSTGRESQL
    show-sql: true
    hibernate:
      ddl-auto: validate
    open-in-view: true

  datasource:
    platform: postgres
    url: jdbc:postgresql://localhost:5432/your_db
    username: your_db_user
    password: your_db_passwd
    driverClassName: org.postgresql.Driver

Note that you do not need the flyway specific config for DB user/url. Spring Boot detects Flyway (or Liquibase if you were using that...) on the classpath. It then uses the primary datasource. See: https://docs.spring.io/spring-boot/docs/2.5.6/reference/html/howto.html#howto.data-initialization . Then the last trick is to make your first script V2__init.sql . This is critical as the baseline-on-migrate: true bit creates the flyway_schema_history table and its action is the first thing, so version 1, or V1_ ie the first row... so your script won't go if it is V1__init.sql or whatever. It will think it has already run. It needs to be the next one, V2__init.sql or whatever.

Nina answered 10/11, 2021 at 23:39 Comment(0)
G
1

spring-boot-starter-data-jpa and mysql-connector-java dependencies are required for flyway to run. You can check that in debug output by enabling logging.level.root=DEBUG in your application properties.

Just add following dependencies to fix the issue:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.28</version>
</dependency>
Grosso answered 8/3, 2022 at 7:0 Comment(1)
For Spring Boot 3.1.2 I had to add a dependency implementation 'org.springframework.boot:spring-boot-starter-data-jpa' for Flyway to start workingVitebsk
T
1

In my case I had the db/migration incorrectly spelled :)

Taddeusz answered 6/4, 2022 at 7:27 Comment(0)
G
1

Tried all of the listed answers, and nothing helped.

Version incompatibility was the cause! Spring Boot 2.7.0 goes with Flyway 8.5.13

Gui answered 20/7, 2022 at 14:2 Comment(1)
Flyway compatibility is the real issue with Spring Boot v2.x.Sheeting
M
0

I'm using maven, and solved this issue by running mvn clean install

Maximo answered 31/12, 2021 at 11:15 Comment(0)
D
0

I found my way here after days of trying different permutations of configurations. For me when trying to upgrade all the way from 6.2.1 to 8.5.11 I simply needed to add flyway.migrate() to the before each in my integration tests.

Delius answered 29/5, 2022 at 13:42 Comment(0)
S
0

In my case, I had not named the migration correctly. I had this name v1_0_7__addEws.sql but it should start with capital V ,ie, V1_0_7__addEws.sql

Smalto answered 31/1, 2023 at 8:27 Comment(0)
H
0

Add dependency

<dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-yourdatabase</artifactId>
    </dependency>
Hiragana answered 12/12, 2023 at 16:28 Comment(0)
U
0

For anyone using Windows and Intelij, what fixed it for me was creating a folder named "db/migrations" NOT "db.migrations" under the resources folder. Intelij for some reason still shows that folder as "db.migrations" once created but now it created my tables on startup.

Untruth answered 25/7, 2024 at 15:16 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.