diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java index ea483ff099ac..a853e245bab9 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java @@ -80,8 +80,11 @@ public BootJar() { getMainSpec().with(this.bootInfSpec); getProject().getConfigurations().all((configuration) -> { ResolvableDependencies incoming = configuration.getIncoming(); - incoming.afterResolve( - (resolvableDependencies) -> this.resolvedDependencies.processConfiguration(configuration)); + incoming.afterResolve((resolvableDependencies) -> { + if (resolvableDependencies == incoming) { + this.resolvedDependencies.processConfiguration(configuration); + } + }); }); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests.java index 361ca73c7cce..7f7998a8b328 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests.java @@ -289,6 +289,13 @@ void multiModuleCustomLayers() throws IOException { assertExtractedLayers(layerNames, indexedLayers); } + @TestTemplate + void whenAResolvableCopyOfAnUnresolvableConfigurationIsResolvedThenResolutionSucceeds() { + BuildResult build = this.gradleBuild.build("resolveResolvableCopyOfUnresolvableConfiguration"); + assertThat(build.task(":resolveResolvableCopyOfUnresolvableConfiguration").getOutcome()) + .isEqualTo(TaskOutcome.SUCCESS); + } + private void assertExtractedLayers(List layerNames, Map> indexedLayers) throws IOException { Map> extractedLayers = readExtractedLayers(this.gradleBuild.getProjectDir(), layerNames); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests-whenAResolvableCopyOfAnUnresolvableConfigurationIsResolvedThenResolutionSucceeds.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests-whenAResolvableCopyOfAnUnresolvableConfigurationIsResolvedThenResolutionSucceeds.gradle new file mode 100644 index 000000000000..2f5e2250a89c --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootJarIntegrationTests-whenAResolvableCopyOfAnUnresolvableConfigurationIsResolvedThenResolutionSucceeds.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '{version}' +} + +bootJar { + mainClass = 'com.example.Application' +} + +task resolveResolvableCopyOfUnresolvableConfiguration { + doFirst { + def copy = configurations.implementation.copyRecursive() + copy.canBeResolved = true + copy.resolve() + } +}