diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java index 8bfc275fe3fc..dc5308f482dc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java @@ -133,7 +133,7 @@ private void configureBootBuildImageTask(Project project, TaskProvider private void configureArtifactPublication(TaskProvider bootJar) { LazyPublishArtifact artifact = new LazyPublishArtifact(bootJar); - this.singlePublishedArtifact.addCandidate(artifact); + this.singlePublishedArtifact.addJarCandidate(artifact); } private void configureBootRunTask(Project project) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SinglePublishedArtifact.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SinglePublishedArtifact.java index 31d13fe6e72a..ab18a059a7ee 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SinglePublishedArtifact.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SinglePublishedArtifact.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2022 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. @@ -38,14 +38,22 @@ final class SinglePublishedArtifact implements Buildable { this.artifacts = artifacts; } - void addCandidate(PublishArtifact candidate) { - if (this.currentArtifact == null || "war".equals(candidate.getExtension())) { - this.artifacts.remove(this.currentArtifact); - this.artifacts.add(candidate); - this.currentArtifact = candidate; + void addWarCandidate(PublishArtifact candidate) { + add(candidate); + } + + void addJarCandidate(PublishArtifact candidate) { + if (this.currentArtifact == null) { + add(candidate); } } + private void add(PublishArtifact artifact) { + this.artifacts.remove(this.currentArtifact); + this.artifacts.add(artifact); + this.currentArtifact = artifact; + } + @Override public TaskDependency getBuildDependencies() { return this.artifacts.getBuildDependencies(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/WarPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/WarPluginAction.java index 7879ae728890..38199a15fab9 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/WarPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/WarPluginAction.java @@ -108,7 +108,7 @@ private void configureBootBuildImageTask(Project project, TaskProvider private void configureArtifactPublication(TaskProvider bootWar) { LazyPublishArtifact artifact = new LazyPublishArtifact(bootWar); - this.singlePublishedArtifact.addCandidate(artifact); + this.singlePublishedArtifact.addWarCandidate(artifact); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java index fee3f56d77a9..1354085b9f39 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,19 +16,25 @@ package org.springframework.boot.gradle.plugin; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.StringReader; import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.TaskOutcome; +import org.gradle.util.GradleVersion; import org.junit.jupiter.api.TestTemplate; import org.springframework.boot.gradle.junit.GradleCompatibility; @@ -154,6 +160,26 @@ void scriptsHaveCorrectPermissions() throws IOException { }); } + @TestTemplate + void taskConfigurationIsAvoided() throws IOException { + BuildResult result = this.gradleBuild.build("help"); + String output = result.getOutput(); + BufferedReader reader = new BufferedReader(new StringReader(output)); + String line; + Set configured = new HashSet<>(); + while ((line = reader.readLine()) != null) { + if (line.startsWith("Configuring :")) { + configured.add(line.substring("Configuring :".length())); + } + } + if (GradleVersion.version(this.gradleBuild.getGradleVersion()).compareTo(GradleVersion.version("7.3.3")) < 0) { + assertThat(configured).containsExactly("help"); + } + else { + assertThat(configured).containsExactlyInAnyOrder("help", "clean"); + } + } + private List zipEntryNames(File distribution) throws IOException { List entryNames = new ArrayList<>(); try (ZipFile zipFile = new ZipFile(distribution)) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java index 8bfb19ac37cb..cde3db181c53 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,13 +16,18 @@ package org.springframework.boot.gradle.plugin; +import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.StringReader; +import java.util.HashSet; +import java.util.Set; import java.util.jar.JarOutputStream; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.TaskOutcome; +import org.gradle.util.GradleVersion; import org.junit.jupiter.api.TestTemplate; import org.springframework.boot.gradle.junit.GradleCompatibility; @@ -159,6 +164,27 @@ void productionRuntimeClasspathIsConfiguredWithResolvabilityAndConsumabilityThat assertThat(productionRuntime).contains("canBeConsumed: false"); } + @TestTemplate + void taskConfigurationIsAvoided() throws IOException { + BuildResult result = this.gradleBuild.build("help"); + String output = result.getOutput(); + BufferedReader reader = new BufferedReader(new StringReader(output)); + String line; + Set configured = new HashSet<>(); + while ((line = reader.readLine()) != null) { + if (line.startsWith("Configuring :")) { + configured.add(line.substring("Configuring :".length())); + } + } + if (!this.gradleBuild.isConfigurationCache() && GradleVersion.version(this.gradleBuild.getGradleVersion()) + .compareTo(GradleVersion.version("7.3.3")) < 0) { + assertThat(configured).containsExactly("help"); + } + else { + assertThat(configured).containsExactlyInAnyOrder("help", "clean"); + } + } + private void createMinimalMainSource() throws IOException { File examplePackage = new File(this.gradleBuild.getProjectDir(), "src/main/java/com/example"); examplePackage.mkdirs(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java index 07568b49a56a..9025861bb837 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,6 +16,14 @@ package org.springframework.boot.gradle.plugin; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashSet; +import java.util.Set; + +import org.gradle.testkit.runner.BuildResult; +import org.gradle.util.GradleVersion; import org.junit.jupiter.api.TestTemplate; import org.springframework.boot.gradle.junit.GradleCompatibility; @@ -57,4 +65,24 @@ void kotlinCompileTasksCanOverrideDefaultJavaParametersFlag() { .contains("compileKotlin java parameters: false").contains("compileTestKotlin java parameters: false"); } + @TestTemplate + void taskConfigurationIsAvoided() throws IOException { + BuildResult result = this.gradleBuild.build("help"); + String output = result.getOutput(); + BufferedReader reader = new BufferedReader(new StringReader(output)); + String line; + Set configured = new HashSet<>(); + while ((line = reader.readLine()) != null) { + if (line.startsWith("Configuring :")) { + configured.add(line.substring("Configuring :".length())); + } + } + if (GradleVersion.version(this.gradleBuild.getGradleVersion()).compareTo(GradleVersion.version("7.3.3")) < 0) { + assertThat(configured).containsExactly("help"); + } + else { + assertThat(configured).containsExactlyInAnyOrder("help", "clean", "compileKotlin", "compileTestKotlin"); + } + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests.java index e1030c63d866..524a914cc058 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,10 +16,16 @@ package org.springframework.boot.gradle.plugin; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashSet; +import java.util.Set; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.TaskOutcome; +import org.gradle.util.GradleVersion; import org.junit.jupiter.api.TestTemplate; import org.springframework.boot.gradle.junit.GradleCompatibility; @@ -67,4 +73,24 @@ void errorMessageIsHelpfulWhenMainClassCannotBeResolved() { assertThat(result.getOutput()).contains("Main class name has not been configured and it could not be resolved"); } + @TestTemplate + void taskConfigurationIsAvoided() throws IOException { + BuildResult result = this.gradleBuild.build("help"); + String output = result.getOutput(); + BufferedReader reader = new BufferedReader(new StringReader(output)); + String line; + Set configured = new HashSet<>(); + while ((line = reader.readLine()) != null) { + if (line.startsWith("Configuring :")) { + configured.add(line.substring("Configuring :".length())); + } + } + if (GradleVersion.version(this.gradleBuild.getGradleVersion()).compareTo(GradleVersion.version("7.3.3")) < 0) { + assertThat(configured).containsExactly("help"); + } + else { + assertThat(configured).containsExactlyInAnyOrder("help", "clean"); + } + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle new file mode 100644 index 000000000000..5e38257d3e83 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' + id 'application' +} + +tasks.configureEach { + println "Configuring ${it.path}" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle new file mode 100644 index 000000000000..152dcf13e1d3 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle @@ -0,0 +1,8 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' +} + +tasks.configureEach { + println "Configuring ${it.path}" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle new file mode 100644 index 000000000000..57b997af8295 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.springframework.boot' version '{version}' +} + +apply plugin: 'org.jetbrains.kotlin.jvm' + +tasks.configureEach { + println "Configuring ${it.path}" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle new file mode 100644 index 000000000000..93d99ceb1148 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/WarPluginActionIntegrationTests-taskConfigurationIsAvoided.gradle @@ -0,0 +1,8 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'war' +} + +tasks.configureEach { + println "Configuring ${it.path}" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java index 6955990d8c64..b9ecb49186fb 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java @@ -164,6 +164,10 @@ public GradleBuild configurationCache() { return this; } + public boolean isConfigurationCache() { + return this.configurationCache; + } + public GradleBuild scriptProperty(String key, String value) { this.scriptProperties.put(key, value); return this;