Rework dep management to avoid consumers picking up strict constraints

Previously, enforcedPlatform dependencies were using to pull in the
constraints defined in spring-boot-dependencies and
spring-boot-parent and applied them strictly so that the constrained
version had to be used. This worked as intended in Spring Boot's own
build but incorrectly enforced those same strict version requirements
on external consumers of Spring Boot's modules.

This commit reworks how Spring Boot defines its internal dependency
management so that platform dependencies are exposed to external
consumers while enforced platform dependencies are using internally.

See gh-19609
pull/19711/head
Andy Wilkinson 5 years ago
parent be79252fbd
commit b34a311d02

@ -52,6 +52,10 @@ gradlePlugin {
id = "org.springframework.boot.conventions"
implementationClass = "org.springframework.boot.build.ConventionsPlugin"
}
dependencyManagementPlugin {
id = "org.springframework.boot.internal-dependency-management"
implementationClass = "org.springframework.boot.build.InternalDependencyManagementPlugin"
}
deployedPlugin {
id = "org.springframework.boot.deployed"
implementationClass = "org.springframework.boot.build.DeployedPlugin"

@ -0,0 +1,60 @@
/*
* Copyright 2020 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.build;
import java.util.Collections;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.plugins.JavaBasePlugin;
import org.springframework.boot.build.optional.OptionalDependenciesPlugin;
/**
* Plugin to apply internal dependency management to Spring Boot's projects. Uses a custom
* configuration to enforce a platform for Spring Boot's own build. This prevents the
* enforced (strict) constraints from being visible to external consumers.
*
* @author Andy Wilkinson
*/
public class InternalDependencyManagementPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getPlugins().withType(JavaBasePlugin.class, (java) -> configureDependencyManagement(project));
}
private void configureDependencyManagement(Project project) {
ConfigurationContainer configurations = project.getConfigurations();
Configuration dependencyManagement = configurations.create("internalDependencyManagement", (configuration) -> {
configuration.setVisible(false);
configuration.setCanBeConsumed(false);
configuration.setCanBeResolved(false);
});
configurations.matching((configuration) -> configuration.getName().endsWith("Classpath"))
.all((configuration) -> configuration.extendsFrom(dependencyManagement));
Dependency springBootParent = project.getDependencies().enforcedPlatform(project.getDependencies()
.project(Collections.singletonMap("path", ":spring-boot-project:spring-boot-parent")));
dependencyManagement.getDependencies().add(springBootParent);
project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations
.getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(dependencyManagement));
}
}

@ -113,7 +113,7 @@ public class BomExtension {
for (String bomImport : group.getBoms()) {
this.putArtifactVersionProperty(group.getId(), bomImport, library.getVersionProperty());
this.dependencyHandler.add("api", this.dependencyHandler
.enforcedPlatform(createDependencyNotation(group.getId(), bomImport, library.getVersion())));
.platform(createDependencyNotation(group.getId(), bomImport, library.getVersion())));
}
}
}

@ -29,6 +29,7 @@ import org.gradle.api.plugins.PluginContainer;
import org.springframework.boot.build.ConventionsPlugin;
import org.springframework.boot.build.DeployedPlugin;
import org.springframework.boot.build.InternalDependencyManagementPlugin;
import org.springframework.boot.build.classpath.CheckClasspathForConflicts;
import org.springframework.boot.build.classpath.CheckClasspathForProhibitedDependencies;
import org.springframework.util.StringUtils;
@ -46,6 +47,7 @@ public class StarterPlugin implements Plugin<Project> {
plugins.apply(DeployedPlugin.class);
plugins.apply(JavaLibraryPlugin.class);
plugins.apply(ConventionsPlugin.class);
plugins.apply(InternalDependencyManagementPlugin.class);
StarterMetadata starterMetadata = project.getTasks().create("starterMetadata", StarterMetadata.class);
ConfigurationContainer configurations = project.getConfigurations();
Configuration runtimeClasspath = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);

@ -5,6 +5,7 @@ plugins {
id 'org.springframework.boot.auto-configuration'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
@ -16,12 +17,13 @@ configurations {
}
dependencies {
asciidoctorExtensions enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
asciidoctorExtensions platform(project(':spring-boot-project:spring-boot-dependencies'))
asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor'
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-actuator')
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
implementation project(':spring-boot-project:spring-boot-autoconfigure')
implementation 'com.fasterxml.jackson.core:jackson-databind'
@ -29,7 +31,7 @@ dependencies {
implementation 'org.springframework:spring-core'
implementation 'org.springframework:spring-context'
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'ch.qos.logback:logback-classic'
optional 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
optional 'com.github.ben-manes.caffeine:caffeine'

@ -9,10 +9,11 @@ plugins {
description = 'Spring Boot Actuator'
dependencies {
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'com.fasterxml.jackson.core:jackson-databind'
optional 'com.hazelcast:hazelcast'
optional 'com.hazelcast:hazelcast-spring'

@ -4,6 +4,7 @@ plugins {
id 'org.springframework.boot.auto-configuration'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
@ -11,10 +12,9 @@ description = 'Spring Boot AutoConfigure'
dependencies {
api project(':spring-boot-project:spring-boot')
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'com.atomikos:transactions-jdbc'
optional 'com.atomikos:transactions-jta'
optional 'com.couchbase.client:couchbase-spring-cache'
@ -149,7 +149,7 @@ dependencies {
optional 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
optional 'redis.clients:jedis'
testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
testImplementation platform(project(':spring-boot-project:spring-boot-parent'))
testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
testImplementation project(':spring-boot-project:spring-boot-test')
testImplementation 'ch.qos.logback:logback-classic'

@ -3,6 +3,7 @@ plugins {
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.integration-test'
id 'org.springframework.boot.internal-dependency-management'
}
description = "Spring Boot CLI"
@ -15,16 +16,14 @@ configurations {
dependencies {
compileOnly project(':spring-boot-project:spring-boot')
compileOnly 'jakarta.servlet:jakarta.servlet-api'
compileOnly 'org.codehaus.groovy:groovy-templates'
compileOnly 'org.springframework:spring-web'
dependenciesBom project(path: ':spring-boot-project:spring-boot-dependencies', configuration: 'effectiveBom')
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
implementation platform(project(':spring-boot-project:spring-boot-parent'))
implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools')
implementation 'com.vaadin.external.google:android-json'
implementation 'jline:jline'
implementation 'net.sf.jopt-simple:jopt-simple'
@ -51,7 +50,7 @@ dependencies {
implementation 'org.springframework:spring-core'
implementation 'org.springframework.security:spring-security-crypto'
intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
intTestImplementation platform(project(':spring-boot-project:spring-boot-dependencies'))
intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools')
intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
intTestImplementation 'org.assertj:assertj-core'

@ -4,6 +4,7 @@ plugins {
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.integration-test'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
@ -14,13 +15,13 @@ configurations {
}
dependencies {
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
implementation project(':spring-boot-project:spring-boot-autoconfigure')
intTestDependencies project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
intTestImplementation project(':spring-boot-project:spring-boot-autoconfigure')
intTestImplementation project(':spring-boot-project:spring-boot-test')
intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
@ -31,7 +32,7 @@ dependencies {
intTestImplementation 'net.bytebuddy:byte-buddy'
intTestRuntimeOnly 'org.springframework:spring-web'
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'javax.servlet:javax.servlet-api'
optional 'org.apache.derby:derby'
optional 'org.hibernate:hibernate-core'

@ -2,12 +2,14 @@ plugins {
id 'java-library'
id 'maven-publish'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Properties Migrator'
dependencies {
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
implementation project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-metadata')

@ -5,7 +5,7 @@ plugins {
description = "Starter for JMS messaging using Apache ActiveMQ"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-jms'
api ('org.apache.activemq:activemq-broker') {

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Boot's Actuator which provides production ready features to help you monitor and manage your application"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-actuator-autoconfigure')
api 'io.micrometer:micrometer-core'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring AMQP and Rabbit MQ"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-messaging'
api 'org.springframework.amqp:spring-rabbit'

@ -5,7 +5,7 @@ plugins {
description = "Starter for aspect-oriented programming with Spring AOP and AspectJ"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-aop'
api 'org.aspectj:aspectjweaver'

@ -5,7 +5,7 @@ plugins {
description = "Starter for JMS messaging using Apache Artemis"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'jakarta.jms:jakarta.jms-api'
api 'jakarta.json:jakarta.json-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Batch"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc')
api 'org.springframework.batch:spring-batch-core'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Framework's caching support"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-context-support'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework.cloud:spring-cloud-spring-service-connector'
api 'org.springframework.cloud:spring-cloud-cloudfoundry-connector'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Cassandra distributed database and Spring Data Cassandra Reactive"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-tx'
api 'org.springframework.data:spring-data-cassandra'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Cassandra distributed database and Spring Data Cassandra"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-tx'
api 'org.springframework.data:spring-data-cassandra'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'io.projectreactor:reactor-core'
api 'io.reactivex:rxjava-reactive-streams'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Couchbase document-oriented database and Spring Data Couchbase"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api ('org.springframework.data:spring-data-couchbase') {
exclude group: 'com.couchbase.client', module: 'encryption'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api ('org.springframework.data:spring-data-elasticsearch') {
exclude group: 'org.elasticsearch.client', module: 'transport'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Data JDBC"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc')
api 'org.springframework.data:spring-data-jdbc'
}

@ -5,12 +5,12 @@ plugins {
description = "Starter for using Spring Data JPA with Hibernate"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-aop')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc')
api 'jakarta.transaction:jakarta.transaction-api'
api 'jakarta.persistence:jakarta.persistence-api'
api ('org.hibernate:hibernate-core') {
api ('org.hibernate:hibernate-core') {
exclude group: 'javax.activation', module: 'javax.activation-api'
exclude group: 'javax.persistence', module: 'javax.persistence-api'
exclude group: 'javax.xml.bind', module: 'jaxb-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Data LDAP"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework.data:spring-data-ldap'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'io.projectreactor:reactor-core'
api 'org.mongodb:mongodb-driver'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using MongoDB document-oriented database and Spring Data MongoDB"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.mongodb:mongodb-driver'
api ('org.springframework.data:spring-data-mongodb') {

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Neo4j graph database and Spring Data Neo4j"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework.data:spring-data-neo4j'
}

@ -5,6 +5,6 @@ plugins {
description = "Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis')
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework.data:spring-data-redis'
api 'io.lettuce:lettuce-core'

@ -5,7 +5,7 @@ plugins {
description = "Starter for exposing Spring Data repositories over REST using Spring Data REST"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
api 'org.springframework.data:spring-data-rest-webmvc'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using the Apache Solr search platform with Spring Data Solr"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api ('org.apache.solr:solr-solrj') {
exclude group: 'org.slf4j', module: 'jcl-over-slf4j'

@ -5,7 +5,7 @@ plugins {
description = "Starter for building MVC web applications using FreeMarker views"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.freemarker:freemarker'
api 'org.springframework:spring-context-support'

@ -5,7 +5,7 @@ plugins {
description = "Starter for building MVC web applications using Groovy Templates views"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
api 'org.codehaus.groovy:groovy-templates'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
api 'org.springframework.hateoas:spring-hateoas'
api 'org.springframework.plugin:spring-plugin-core'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Integration"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-aop')
api 'org.springframework.integration:spring-integration-core'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using JDBC with the HikariCP connection pool"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'com.zaxxer:HikariCP'
api 'org.springframework:spring-jdbc'

@ -5,7 +5,7 @@ plugins {
description = "Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-validation')

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Jetty as the embedded servlet container. An alternative to spring-boot-starter-tomcat"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'jakarta.servlet:jakarta.servlet-api'
api 'jakarta.websocket:jakarta.websocket-api'
api 'org.eclipse.jetty:jetty-servlets'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbc"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc')
api 'jakarta.activation:jakarta.activation-api'
api 'jakarta.xml.bind:jakarta.xml.bind-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for reading and writing json"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-web'
api 'com.fasterxml.jackson.core:jackson-databind'

@ -5,7 +5,7 @@ plugins {
description = "Starter for JTA transactions using Atomikos"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'com.atomikos:transactions-jms'
api 'com.atomikos:transactions-jta'

@ -5,7 +5,7 @@ plugins {
description = "Starter for JTA transactions using Bitronix"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'jakarta.jms:jakarta.jms-api'
api 'jakarta.transaction:jakarta.transaction-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Log4j2 for logging. An alternative to spring-boot-starter-logging"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'org.apache.logging.log4j:log4j-slf4j-impl'
api 'org.apache.logging.log4j:log4j-core'
api 'org.apache.logging.log4j:log4j-jul'

@ -5,7 +5,7 @@ plugins {
description = "Starter for logging using Logback. Default logging starter"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'ch.qos.logback:logback-classic'
api 'org.apache.logging.log4j:log4j-to-slf4j'
api 'org.slf4j:jul-to-slf4j'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Java Mail and Spring Framework's email sending support"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-context-support'
api 'com.sun.mail:jakarta.mail'

@ -5,7 +5,7 @@ plugins {
description = "Starter for building web applications using Mustache views"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'com.samskivert:jmustache'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Security's OAuth2/OpenID Connect client features"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'com.sun.mail:jakarta.mail'
api 'org.springframework.security:spring-security-config'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Security's OAuth2 resource server features"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework.security:spring-security-config'
api 'org.springframework.security:spring-security-core'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using the Quartz scheduler"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-context-support'
api 'org.springframework:spring-tx'

@ -5,6 +5,6 @@ plugins {
description = "Starter for using Reactor Netty as the embedded reactive HTTP server."
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'io.projectreactor.netty:reactor-netty'
}

@ -5,7 +5,7 @@ plugins {
description = "Starter for building RSocket clients and servers"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-reactor-netty')

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Security"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.springframework:spring-aop'
api 'org.springframework.security:spring-security-config'

@ -5,7 +5,7 @@ plugins {
description = "Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-test')

@ -5,7 +5,7 @@ plugins {
description = "Starter for building MVC web applications using Thymeleaf views"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.thymeleaf:thymeleaf-spring5'
api 'org.thymeleaf.extras:thymeleaf-extras-java8time'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by spring-boot-starter-web"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'jakarta.annotation:jakarta.annotation-api'
api ('org.apache.tomcat.embed:tomcat-embed-core') {
exclude group: 'org.apache.tomcat', module: 'tomcat-annotations-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Undertow as the embedded servlet container. An alternative to spring-boot-starter-tomcat"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'io.undertow:undertow-core'
api ('io.undertow:undertow-servlet') {
exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Java Bean Validation with Hibernate Validator"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api 'org.glassfish:jakarta.el'
api 'org.hibernate.validator:hibernate-validator'

@ -5,7 +5,7 @@ plugins {
description = "Starter for using Spring Web Services"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
api 'com.sun.xml.messaging.saaj:saaj-impl'
api 'jakarta.xml.ws:jakarta.xml.ws-api'

@ -5,7 +5,7 @@ plugins {
description = "Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat')

@ -5,7 +5,7 @@ plugins {
description = "Starter for building WebFlux applications using Spring Framework's Reactive Web support"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json')
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-reactor-netty')

@ -5,7 +5,7 @@ plugins {
description = "Starter for building WebSocket applications using Spring Framework's WebSocket support"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')
api 'org.springframework:spring-messaging'
api 'org.springframework:spring-websocket'

@ -5,7 +5,7 @@ plugins {
description = "Core starter, including auto-configuration support, logging and YAML"
dependencies {
api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api project(':spring-boot-project:spring-boot')
api project(':spring-boot-project:spring-boot-autoconfigure')

@ -2,18 +2,20 @@ plugins {
id 'java-library'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
description = 'Spring Boot Test AutoConfigure'
dependencies {
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
implementation project(':spring-boot-project:spring-boot-test')
implementation project(':spring-boot-project:spring-boot-autoconfigure')
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'javax.json.bind:javax.json.bind-api'
optional 'javax.servlet:javax.servlet-api'
optional 'javax.transaction:javax.transaction-api'
@ -46,7 +48,6 @@ dependencies {
optional 'org.mongodb:mongodb-driver-async'
optional 'org.mongodb:mongodb-driver-reactivestreams'
testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
testImplementation 'ch.qos.logback:logback-classic'
testImplementation 'com.fasterxml.jackson.module:jackson-module-parameter-names'

@ -3,16 +3,17 @@ plugins {
id 'org.jetbrains.kotlin.jvm'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
description = 'Spring Boot Test'
dependencies {
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
api platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot')
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'com.fasterxml.jackson.core:jackson-databind'
optional 'com.google.code.gson:gson'
optional 'com.jayway.jsonpath:json-path'
@ -36,7 +37,6 @@ dependencies {
optional 'org.springframework:spring-webflux'
optional 'net.sourceforge.htmlunit:htmlunit'
testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
testImplementation 'io.mockk:mockk'
testImplementation 'javax.json:javax.json-api'

@ -2,6 +2,7 @@ plugins {
id 'java-library'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Antlib'
@ -19,10 +20,11 @@ dependencies {
antUnit "org.apache.ant:ant-antunit:1.3"
antIvy "org.apache.ivy:ivy:2.4.0"
api platform(project(":spring-boot-project:spring-boot-dependencies"))
compileOnly project(":spring-boot-project:spring-boot-tools:spring-boot-loader")
compileOnly "org.apache.ant:ant:${antVersion}"
implementation enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies"))
implementation project(":spring-boot-project:spring-boot-tools:spring-boot-loader-tools")
implementation "org.springframework:spring-core"
}

@ -2,12 +2,14 @@ plugins {
id 'java-library'
id 'maven-publish'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Configuration Metadata'
dependencies {
implementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent"))
api platform(project(path: ":spring-boot-project:spring-boot-parent"))
implementation "com.vaadin.external.google:android-json"
testImplementation "org.junit.jupiter:junit-jupiter"

@ -4,6 +4,7 @@ plugins {
id 'org.asciidoctor.jvm.convert'
id 'org.asciidoctor.jvm.pdf'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.maven-repository'
id 'org.springframework.boot.optional-dependencies'
}
@ -25,14 +26,16 @@ repositories {
}
dependencies {
api platform(project(':spring-boot-project:spring-boot-dependencies'))
asciidoctorExtensions 'io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.3.0.RELEASE'
implementation platform(project(':spring-boot-project:spring-boot-dependencies'))
implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools')
implementation 'io.spring.gradle:dependency-management-plugin'
implementation 'org.apache.commons:commons-compress'
implementation 'org.springframework:spring-core'
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50'
testImplementation 'org.junit.jupiter:junit-jupiter'

@ -2,6 +2,7 @@ plugins {
id 'java-library'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Loader Tools'
@ -13,11 +14,11 @@ configurations {
}
dependencies {
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api "org.apache.commons:commons-compress:1.19"
compileOnly "ch.qos.logback:logback-classic"
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
implementation "org.springframework:spring-core"
loader project(":spring-boot-project:spring-boot-tools:spring-boot-loader")

@ -2,14 +2,15 @@ plugins {
id 'java-library'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Loader'
dependencies {
compileOnly "org.springframework:spring-core"
api platform(project(":spring-boot-project:spring-boot-dependencies"))
implementation enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies"))
compileOnly "org.springframework:spring-core"
testImplementation project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")

@ -2,6 +2,7 @@ plugins {
id 'org.asciidoctor.jvm.convert'
id 'org.asciidoctor.jvm.pdf'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.maven-plugin'
id 'org.springframework.boot.optional-dependencies'
}
@ -13,25 +14,25 @@ configurations {
}
dependencies {
api platform(project(':spring-boot-project:spring-boot-parent'))
compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations'
compileOnly 'org.sonatype.plexus:plexus-build-api'
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools')
implementation 'org.apache.maven.shared:maven-common-artifact-filters'
implementation 'org.apache.maven:maven-plugin-api'
intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
intTestImplementation platform(project(':spring-boot-project:spring-boot-parent'))
intTestImplementation 'org.apache.maven.shared:maven-invoker'
intTestImplementation 'org.assertj:assertj-core'
intTestImplementation 'org.junit.jupiter:junit-jupiter'
optional enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
optional platform(project(':spring-boot-project:spring-boot-parent'))
optional 'org.apache.maven.plugins:maven-shade-plugin'
runtimeOnly 'org.sonatype.plexus:plexus-build-api'
testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
testImplementation 'org.assertj:assertj-core'
testImplementation 'org.junit.jupiter:junit-jupiter'
testImplementation 'org.mockito:mockito-core'

@ -1,11 +1,14 @@
plugins {
id 'java-library'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Testing Support'
dependencies {
api platform(project(path: ":spring-boot-project:spring-boot-parent"))
compileOnly "com.datastax.oss:java-driver-core"
compileOnly "javax.servlet:javax.servlet-api"
compileOnly "junit:junit"
@ -17,7 +20,6 @@ dependencies {
compileOnly "org.springframework.data:spring-data-redis"
compileOnly "org.testcontainers:testcontainers"
implementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent"))
implementation "org.apache.maven.resolver:maven-resolver-connector-basic"
implementation "org.apache.maven.resolver:maven-resolver-impl"
implementation "org.apache.maven:maven-resolver-provider"

@ -4,21 +4,22 @@ plugins {
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.configuration-properties'
id 'org.springframework.boot.deployed'
id 'org.springframework.boot.internal-dependency-management'
id 'org.springframework.boot.optional-dependencies'
}
description = 'Spring Boot'
dependencies {
annotationProcessor enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
annotationProcessor platform(project(':spring-boot-project:spring-boot-dependencies'))
annotationProcessor 'org.apache.logging.log4j:log4j-core'
api platform(project(':spring-boot-project:spring-boot-dependencies'))
api 'org.springframework:spring-core'
api 'org.springframework:spring-context'
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
optional platform(project(':spring-boot-project:spring-boot-dependencies'))
optional 'ch.qos.logback:logback-classic'
optional 'com.atomikos:transactions-jdbc'
optional 'com.atomikos:transactions-jms'

@ -29,7 +29,7 @@ dependencies {
testRepository project(path: ':spring-boot-project:spring-boot-tools:spring-boot-loader', configuration: 'mavenRepository')
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter', configuration: 'mavenRepository')
testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
testImplementation platform(project(':spring-boot-project:spring-boot-dependencies'))
testImplementation project(path: ':spring-boot-project:spring-boot-tools:spring-boot-loader-tools')
testImplementation 'org.assertj:assertj-core'
testImplementation 'org.junit.jupiter:junit-jupiter'

@ -1,6 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot.conventions'
id 'org.springframework.boot.internal-dependency-management'
}
description = 'Spring Boot Atmosphere smoke test'

@ -8,18 +8,18 @@ description = 'Spring Boot Jetty JSP smoke test'
dependencies {
compileOnly 'jakarta.servlet:jakarta.servlet-api'
compileOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty')
implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) {
exclude module: 'spring-boot-starter-tomcat'
}
providedRuntime enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
providedRuntime platform(project(':spring-boot-project:spring-boot-dependencies'))
providedRuntime('org.eclipse.jetty:apache-jsp') {
exclude group: 'javax.annotation', module: 'javax.annotation-api'
}
runtimeOnly 'javax.servlet:jstl'
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty')
}

@ -5,12 +5,12 @@ plugins {
description = 'Spring Boot war smoke test'
dependencies {
dependencies {
implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) {
exclude module: 'spring-boot-starter-tomcat'
}
providedCompile enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
providedCompile platform(project(':spring-boot-project:spring-boot-dependencies'))
providedCompile 'jakarta.servlet:jakarta.servlet-api'
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
}

Loading…
Cancel
Save