diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java index 71199a2951e..00ba7218499 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java @@ -16,6 +16,9 @@ package org.springframework.boot.gradle.plugin; +import java.util.Set; +import java.util.stream.Stream; + import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; @@ -155,7 +158,7 @@ public class SpringBootAotPlugin implements Plugin { classpath.setCanBeConsumed(false); classpath.setCanBeResolved(true); classpath.setDescription("Classpath of the " + taskName + " task."); - base.getExtendsFrom().forEach(classpath::extendsFrom); + removeDevelopmentOnly(base.getExtendsFrom()).forEach(classpath::extendsFrom); classpath.attributes((attributes) -> { AttributeContainer baseAttributes = base.getAttributes(); for (Attribute attribute : baseAttributes.keySet()) { @@ -166,6 +169,14 @@ public class SpringBootAotPlugin implements Plugin { return aotClasspath; } + private Stream removeDevelopmentOnly(Set configurations) { + return configurations.stream().filter(this::isNotDevelopmentOnly); + } + + private boolean isNotDevelopmentOnly(Configuration configuration) { + return !SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME.equals(configuration.getName()); + } + private void configureDependsOn(Project project, SourceSet aotSourceSet, TaskProvider processAot) { project.getTasks() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java index 61044f636ec..b3d9932037a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java @@ -95,6 +95,18 @@ class SpringBootAotPluginIntegrationTests { assertThat(output).contains("org.jboss.logging" + File.separatorChar + "jboss-logging"); } + @TestTemplate + void processAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath() { + String output = this.gradleBuild.build("processAotClasspath").getOutput(); + assertThat(output).doesNotContain("commons-lang"); + } + + @TestTemplate + void processTestAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath() { + String output = this.gradleBuild.build("processTestAotClasspath", "--stacktrace").getOutput(); + assertThat(output).doesNotContain("commons-lang"); + } + @TestTemplate void processAotRunsWhenProjectHasMainSource() throws IOException { writeMainClass("org.springframework.boot", "SpringApplicationAotProcessor"); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle new file mode 100644 index 00000000000..a9a22712d75 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle @@ -0,0 +1,20 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' +} + +apply plugin: 'org.springframework.boot.aot' + +repositories { + mavenCentral() +} + +dependencies { + developmentOnly("org.apache.commons:commons-lang3:3.12.0") +} + +task('processAotClasspath') { + doFirst { + tasks.processAot.classpath.each { println it } + } +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processTestAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processTestAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle new file mode 100644 index 00000000000..80fdfbd3a15 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-processTestAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath.gradle @@ -0,0 +1,31 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' +} + +apply plugin: 'org.springframework.boot.aot' + +repositories { + mavenCentral() + maven { url 'file:repository' } +} + +configurations.all { + resolutionStrategy { + eachDependency { + if (it.requested.group == 'org.springframework.boot') { + it.useVersion project.bootVersion + } + } + } +} + +dependencies { + developmentOnly("org.apache.commons:commons-lang3:3.12.0") +} + +task('processTestAotClasspath') { + doFirst { + tasks.processTestAot.classpath.each { println it } + } +}