Skip to content

Commit a1e279f

Browse files
committed
Make Flyway and Liquibase auto-config back off without spring-jdbc
The auto-config requires Spring JDBC for DataSource creation from spring.flyway.url or spring.liquibase.url, checking Flyway migrations exist, etc. Without it, the application fails to start due to missing spring-jdbc classes. This commit updates the auto-config so that it backs off in the absence of spring-jdbc. Closes gh-26849
1 parent 7ba575d commit a1e279f

File tree

4 files changed

+19
-0
lines changed

4 files changed

+19
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public FlywaySchemaManagementProvider flywayDefaultDdlModeProvider(ObjectProvide
115115
}
116116

117117
@Configuration(proxyBeanMethods = false)
118+
@ConditionalOnClass(JdbcUtils.class)
118119
@ConditionalOnMissingBean(Flyway.class)
119120
@EnableConfigurationProperties({ DataSourceProperties.class, FlywayProperties.class })
120121
@Import({ FlywayMigrationInitializerEntityManagerFactoryDependsOnPostProcessor.class,

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.springframework.context.annotation.Conditional;
5353
import org.springframework.context.annotation.Configuration;
5454
import org.springframework.context.annotation.Import;
55+
import org.springframework.jdbc.core.ConnectionCallback;
5556
import org.springframework.jdbc.core.JdbcOperations;
5657
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
5758
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
@@ -92,6 +93,7 @@ public LiquibaseSchemaManagementProvider liquibaseDefaultDdlModeProvider(
9293
}
9394

9495
@Configuration(proxyBeanMethods = false)
96+
@ConditionalOnClass(ConnectionCallback.class)
9597
@ConditionalOnMissingBean(SpringLiquibase.class)
9698
@EnableConfigurationProperties({ DataSourceProperties.class, LiquibaseProperties.class })
9799
public static class LiquibaseConfiguration {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.springframework.boot.jdbc.DataSourceBuilder;
4747
import org.springframework.boot.jdbc.SchemaManagement;
4848
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
49+
import org.springframework.boot.test.context.FilteredClassLoader;
4950
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
5051
import org.springframework.boot.test.system.CapturedOutput;
5152
import org.springframework.boot.test.system.OutputCaptureExtension;
@@ -104,6 +105,13 @@ void createsDataSourceWithNoDataSourceBeanAndFlywayUrl() {
104105
});
105106
}
106107

108+
@Test
109+
void backsOffWithFlywayUrlAndNoSpringJdbc() {
110+
this.contextRunner.withPropertyValues("spring.flyway.url:jdbc:hsqldb:mem:" + UUID.randomUUID())
111+
.withClassLoader(new FilteredClassLoader("org.springframework.jdbc"))
112+
.run((context) -> assertThat(context).doesNotHaveBean(Flyway.class));
113+
}
114+
107115
@Test
108116
void createDataSourceWithUrl() {
109117
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.file.Files;
2222
import java.nio.file.Path;
2323
import java.util.Map;
24+
import java.util.UUID;
2425
import java.util.function.Consumer;
2526

2627
import javax.sql.DataSource;
@@ -104,6 +105,13 @@ void createsDataSourceWithNoDataSourceBeanAndLiquibaseUrl() {
104105
}));
105106
}
106107

108+
@Test
109+
void backsOffWithLiquibaseUrlAndNoSpringJdbc() {
110+
this.contextRunner.withPropertyValues("spring.liquibase.url:jdbc:hsqldb:mem:" + UUID.randomUUID())
111+
.withClassLoader(new FilteredClassLoader("org.springframework.jdbc"))
112+
.run((context) -> assertThat(context).doesNotHaveBean(SpringLiquibase.class));
113+
}
114+
107115
@Test
108116
void createsDataSourceWhenSpringJdbcOnlyAvailableWithNoDataSourceBeanAndLiquibaseUrl() {
109117
this.contextRunner.withPropertyValues("spring.liquibase.url:jdbc:hsqldb:mem:liquibase")

0 commit comments

Comments
 (0)