Skip to content

Commit c39a37c

Browse files
committed
Exclude developmentOnly dependences from AOT processing classpaths
Fixes gh-35433
1 parent 2537567 commit c39a37c

File tree

4 files changed

+75
-1
lines changed

4 files changed

+75
-1
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
package org.springframework.boot.gradle.plugin;
1818

19+
import java.util.Set;
20+
import java.util.stream.Stream;
21+
1922
import org.gradle.api.Plugin;
2023
import org.gradle.api.Project;
2124
import org.gradle.api.artifacts.Configuration;
@@ -155,7 +158,7 @@ private Configuration createAotProcessingClasspath(Project project, String taskN
155158
classpath.setCanBeConsumed(false);
156159
classpath.setCanBeResolved(true);
157160
classpath.setDescription("Classpath of the " + taskName + " task.");
158-
base.getExtendsFrom().forEach(classpath::extendsFrom);
161+
removeDevelopmentOnly(base.getExtendsFrom()).forEach(classpath::extendsFrom);
159162
classpath.attributes((attributes) -> {
160163
AttributeContainer baseAttributes = base.getAttributes();
161164
for (Attribute<?> attribute : baseAttributes.keySet()) {
@@ -166,6 +169,14 @@ private Configuration createAotProcessingClasspath(Project project, String taskN
166169
return aotClasspath;
167170
}
168171

172+
private Stream<Configuration> removeDevelopmentOnly(Set<Configuration> configurations) {
173+
return configurations.stream().filter(this::isNotDevelopmentOnly);
174+
}
175+
176+
private boolean isNotDevelopmentOnly(Configuration configuration) {
177+
return !SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME.equals(configuration.getName());
178+
}
179+
169180
private void configureDependsOn(Project project, SourceSet aotSourceSet,
170181
TaskProvider<? extends AbstractAot> processAot) {
171182
project.getTasks()

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ void processTestAotHasTransitiveRuntimeDependenciesOnItsClasspath() {
9595
assertThat(output).contains("org.jboss.logging" + File.separatorChar + "jboss-logging");
9696
}
9797

98+
@TestTemplate
99+
void processAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath() {
100+
String output = this.gradleBuild.build("processAotClasspath").getOutput();
101+
assertThat(output).doesNotContain("commons-lang");
102+
}
103+
104+
@TestTemplate
105+
void processTestAotDoesNotHaveDevelopmentOnlyDependenciesOnItsClasspath() {
106+
String output = this.gradleBuild.build("processTestAotClasspath", "--stacktrace").getOutput();
107+
assertThat(output).doesNotContain("commons-lang");
108+
}
109+
98110
@TestTemplate
99111
void processAotRunsWhenProjectHasMainSource() throws IOException {
100112
writeMainClass("org.springframework.boot", "SpringApplicationAotProcessor");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
id 'org.springframework.boot' version '{version}'
3+
id 'java'
4+
}
5+
6+
apply plugin: 'org.springframework.boot.aot'
7+
8+
repositories {
9+
mavenCentral()
10+
}
11+
12+
dependencies {
13+
developmentOnly("org.apache.commons:commons-lang3:3.12.0")
14+
}
15+
16+
task('processAotClasspath') {
17+
doFirst {
18+
tasks.processAot.classpath.each { println it }
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
plugins {
2+
id 'org.springframework.boot' version '{version}'
3+
id 'java'
4+
}
5+
6+
apply plugin: 'org.springframework.boot.aot'
7+
8+
repositories {
9+
mavenCentral()
10+
maven { url 'file:repository' }
11+
}
12+
13+
configurations.all {
14+
resolutionStrategy {
15+
eachDependency {
16+
if (it.requested.group == 'org.springframework.boot') {
17+
it.useVersion project.bootVersion
18+
}
19+
}
20+
}
21+
}
22+
23+
dependencies {
24+
developmentOnly("org.apache.commons:commons-lang3:3.12.0")
25+
}
26+
27+
task('processTestAotClasspath') {
28+
doFirst {
29+
tasks.processTestAot.classpath.each { println it }
30+
}
31+
}

0 commit comments

Comments
 (0)