diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/ROOT/pages/system-requirements.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/ROOT/pages/system-requirements.adoc index 04cfa25b494..1a9fa9e71f5 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/ROOT/pages/system-requirements.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/ROOT/pages/system-requirements.adoc @@ -4,6 +4,9 @@ Spring Boot {version-spring-boot} requires at least https://www.java.com[Java 17] and is compatible with versions up to and including Java 25. {url-spring-framework-docs}/[Spring Framework {version-spring-framework}] or above is also required. +Support for third-party projects may have additional or higher requirements. +Refer to the documentation for that support for further details. + Explicit build support is provided for the following build tools: |=== diff --git a/module/spring-boot-flyway/build.gradle b/module/spring-boot-flyway/build.gradle index 6a06299fdad..d936725a905 100644 --- a/module/spring-boot-flyway/build.gradle +++ b/module/spring-boot-flyway/build.gradle @@ -49,7 +49,6 @@ dependencies { dockerTestRuntimeOnly("org.postgresql:postgresql") testImplementation(project(":core:spring-boot-test")) - testImplementation(project(":module:spring-boot-jooq")) testImplementation(project(":test-support:spring-boot-test-support")) testImplementation(testFixtures(project(":core:spring-boot-autoconfigure"))) testImplementation("jakarta.persistence:jakarta.persistence-api") diff --git a/module/spring-boot-flyway/src/test/java/org/springframework/boot/flyway/autoconfigure/FlywayAutoConfigurationTests.java b/module/spring-boot-flyway/src/test/java/org/springframework/boot/flyway/autoconfigure/FlywayAutoConfigurationTests.java index b1e47a43bcb..240d57e6c43 100644 --- a/module/spring-boot-flyway/src/test/java/org/springframework/boot/flyway/autoconfigure/FlywayAutoConfigurationTests.java +++ b/module/spring-boot-flyway/src/test/java/org/springframework/boot/flyway/autoconfigure/FlywayAutoConfigurationTests.java @@ -49,9 +49,6 @@ import org.flywaydb.database.oracle.OracleConfigurationExtension; import org.flywaydb.database.postgresql.PostgreSQLConfigurationExtension; import org.flywaydb.database.sqlserver.SQLServerConfigurationExtension; import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform; -import org.jooq.DSLContext; -import org.jooq.SQLDialect; -import org.jooq.impl.DefaultDSLContext; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InOrder; @@ -60,7 +57,6 @@ import org.postgresql.Driver; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.flyway.autoconfigure.FlywayAutoConfiguration.FlywayAutoConfigurationRuntimeHints; @@ -822,37 +818,6 @@ class FlywayAutoConfigurationTests { }); } - @Test - void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class) - .run((context) -> { - BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); - assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayInitializer", "flyway"); - }); - } - - @Test - void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() { - this.contextRunner - .withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class, - CustomFlywayMigrationInitializer.class) - .run((context) -> { - BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); - assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayMigrationInitializer", - "flyway"); - }); - } - - @Test - void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() { - this.contextRunner - .withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class, CustomFlyway.class) - .run((context) -> { - BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); - assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("customFlyway"); - }); - } - @Test void scriptPlaceholderPrefixIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) @@ -1186,16 +1151,6 @@ class FlywayAutoConfigurationTests { } - @Configuration(proxyBeanMethods = false) - static class JooqConfiguration { - - @Bean - DSLContext dslContext() { - return new DefaultDSLContext(SQLDialect.H2); - } - - } - @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(DataSourceProperties.class) abstract static class AbstractUserH2DataSourceConfiguration { diff --git a/module/spring-boot-jooq-test/build.gradle b/module/spring-boot-jooq-test/build.gradle index e49a22569ef..de8c4b34d97 100644 --- a/module/spring-boot-jooq-test/build.gradle +++ b/module/spring-boot-jooq-test/build.gradle @@ -23,6 +23,12 @@ plugins { description = "Spring Boot jOOQ Test" +systemRequirements { + java { + version = JavaLanguageVersion.of(21) + } +} + dependencies { api(project(":core:spring-boot-test-autoconfigure")) api(project(":module:spring-boot-jdbc-test")) diff --git a/module/spring-boot-jooq/build.gradle b/module/spring-boot-jooq/build.gradle index efc42342375..1b2cb039a80 100644 --- a/module/spring-boot-jooq/build.gradle +++ b/module/spring-boot-jooq/build.gradle @@ -24,6 +24,12 @@ plugins { description = "Spring Boot jOOQ" +systemRequirements { + java { + version = JavaLanguageVersion.of(21) + } +} + dependencies { api(project(":module:spring-boot-jdbc")) api(project(":module:spring-boot-transaction")) @@ -34,6 +40,7 @@ dependencies { optional("jakarta.xml.bind:jakarta.xml.bind-api") testImplementation(project(":core:spring-boot-test")) + testImplementation(project(":module:spring-boot-flyway")) testImplementation(project(":test-support:spring-boot-test-support")) testRuntimeOnly("ch.qos.logback:logback-classic") diff --git a/module/spring-boot-jooq/src/test/java/org/springframework/boot/jooq/autoconfigure/JooqFlywayDatabaseInitializationTests.java b/module/spring-boot-jooq/src/test/java/org/springframework/boot/jooq/autoconfigure/JooqFlywayDatabaseInitializationTests.java new file mode 100644 index 00000000000..da0a53ac369 --- /dev/null +++ b/module/spring-boot-jooq/src/test/java/org/springframework/boot/jooq/autoconfigure/JooqFlywayDatabaseInitializationTests.java @@ -0,0 +1,105 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jooq.autoconfigure; + +import org.flywaydb.core.Flyway; +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.jooq.impl.DefaultDSLContext; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.flyway.autoconfigure.FlywayAutoConfiguration; +import org.springframework.boot.flyway.autoconfigure.FlywayMigrationInitializer; +import org.springframework.boot.jdbc.autoconfigure.EmbeddedDataSourceConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for jOQQ when Flyway is being used for DB initialization. + * + * @author Andy Wilkinson + */ +class JooqFlywayDatabaseInitializationTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(FlywayAutoConfiguration.class)) + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class) + .withPropertyValues("spring.datasource.generate-unique-name=true"); + + @Test + void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() { + this.contextRunner.run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); + assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayInitializer", "flyway"); + }); + } + + @Test + void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() { + this.contextRunner.withUserConfiguration(CustomFlywayMigrationInitializer.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); + assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayMigrationInitializer", "flyway"); + }); + } + + @Test + void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() { + this.contextRunner.withUserConfiguration(CustomFlyway.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); + assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("customFlyway"); + }); + } + + @Configuration(proxyBeanMethods = false) + static class JooqConfiguration { + + @Bean + DSLContext dslContext() { + return new DefaultDSLContext(SQLDialect.H2); + } + + } + + @Configuration(proxyBeanMethods = false) + static class CustomFlywayMigrationInitializer { + + @Bean + FlywayMigrationInitializer flywayMigrationInitializer(Flyway flyway) { + FlywayMigrationInitializer initializer = new FlywayMigrationInitializer(flyway); + initializer.setOrder(Ordered.HIGHEST_PRECEDENCE); + return initializer; + } + + } + + @Configuration(proxyBeanMethods = false) + static class CustomFlyway { + + @Bean + Flyway customFlyway() { + return Flyway.configure().load(); + } + + } + +} diff --git a/module/spring-boot-jooq/src/test/resources/org/springframework/boot/jooq/autoconfigure/settings.xml b/module/spring-boot-jooq/src/test/resources/org/springframework/boot/jooq/autoconfigure/settings.xml index a27dfdd83cb..8a8b68db0f6 100644 --- a/module/spring-boot-jooq/src/test/resources/org/springframework/boot/jooq/autoconfigure/settings.xml +++ b/module/spring-boot-jooq/src/test/resources/org/springframework/boot/jooq/autoconfigure/settings.xml @@ -1,4 +1,4 @@ - + 100 diff --git a/platform/spring-boot-dependencies/build.gradle b/platform/spring-boot-dependencies/build.gradle index eaeb23c0e07..cbd496374ca 100644 --- a/platform/spring-boot-dependencies/build.gradle +++ b/platform/spring-boot-dependencies/build.gradle @@ -1058,11 +1058,7 @@ bom { ] } } - library("jOOQ", "3.19.29") { - prohibit { - versionRange "[3.20.0,)" - because "it requires Java 21" - } + library("jOOQ", "3.20.10") { group("org.jooq") { bom("jooq-bom") plugins = [