From e415f759a201f4581260456a2aa326ac85f65135 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 13 Jan 2020 12:09:21 +0000 Subject: [PATCH] Raise the minimum supported version of Gradle to 5.6 Closes gh-18777 --- .../src/docs/asciidoc/build-tool-plugins.adoc | 2 +- .../src/docs/asciidoc/getting-started.adoc | 6 ++-- .../src/docs/asciidoc/index.adoc | 2 +- .../boot/gradle/dsl/SpringBootExtension.java | 28 +---------------- .../boot/gradle/plugin/SpringBootPlugin.java | 4 +-- .../tasks/bundling/BootArchiveSupport.java | 31 +++---------------- .../bundling/LaunchScriptConfiguration.java | 27 +--------------- .../docs/RunningDocumentationTests.java | 4 +-- .../junit/GradleCompatibilityExtension.java | 3 +- .../SpringBootPluginIntegrationTests.java | 8 ++--- .../LaunchScriptConfigurationTests.java | 8 +++++ .../boot/gradle/testkit/GradleBuild.java | 3 -- 12 files changed, 28 insertions(+), 98 deletions(-) diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc index e85267f5d07..950901e1370 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc @@ -160,7 +160,7 @@ Advanced configuration options and examples are available in the {spring-boot-ma [[build-tool-plugins-gradle-plugin]] == Spring Boot Gradle Plugin The Spring Boot Gradle Plugin provides Spring Boot support in Gradle, letting you package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by `spring-boot-dependencies`. -It requires Gradle 5.x (4.10 is also supported but this support is deprecated and will be removed in a future release). +It requires Gradle 6.x (5.6 is also supported but this support is deprecated and will be removed in a future release). Please refer to the plugin's documentation to learn more: * Reference ({spring-boot-gradle-plugin-docs}[HTML] and {spring-boot-gradle-plugin-pdfdocs}[PDF]) diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc index cbd79142ff8..907d6707b1d 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc @@ -41,7 +41,7 @@ Explicit build support is provided for the following build tools: | 3.3+ | Gradle -| 5.x and 6.x (4.10 is also supported but in a deprecated form) +| 6.x (5.6 is also supported but in a deprecated form) |=== @@ -195,8 +195,8 @@ In those cases, see <> [[getting-started-gradle-installation]] ==== Gradle Installation -Spring Boot is compatible with 5.x and 6.x. -4.10 is also supported but this support is deprecated and will be removed in a future release. +Spring Boot is compatible with 6.x. +5.6 is also supported but this support is deprecated and will be removed in a future release. If you do not already have Gradle installed, you can follow the instructions at https://gradle.org. Spring Boot dependencies can be declared by using the `org.springframework.boot` `group`. diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc index efe4d2e371e..435be277971 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc @@ -38,7 +38,7 @@ Andy Wilkinson The Spring Boot Gradle Plugin provides Spring Boot support in https://gradle.org[Gradle]. It allows you to package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by `spring-boot-dependencies`. -Spring Boot's Gradle plugin requires Gradle 5.x or 6.x (4.10 is also supported but this support is deprecated and will be removed in a future release). +Spring Boot's Gradle plugin requires Gradle 6.x (5.6 is also supported but this support is deprecated and will be removed in a future release). In addition to this user guide, {api-documentation}[API documentation] is also available. diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/SpringBootExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/SpringBootExtension.java index d1d8e78a414..b94233121cd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/SpringBootExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/SpringBootExtension.java @@ -17,16 +17,13 @@ package org.springframework.boot.gradle.dsl; import java.io.File; -import java.lang.reflect.Method; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.plugins.BasePlugin; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.provider.Property; import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.jvm.tasks.Jar; import org.springframework.boot.gradle.tasks.buildinfo.BuildInfo; @@ -118,7 +115,7 @@ public class SpringBootExtension { private String determineArtifactBaseName() { Jar artifactTask = findArtifactTask(); - return (artifactTask != null) ? getArchiveBaseName(artifactTask) : null; + return (artifactTask != null) ? artifactTask.getArchiveBaseName().get() : null; } private Jar findArtifactTask() { @@ -129,27 +126,4 @@ public class SpringBootExtension { return (Jar) this.project.getTasks().findByName("bootJar"); } - @SuppressWarnings("unchecked") - private static String getArchiveBaseName(AbstractArchiveTask task) { - try { - Method method = findMethod(task.getClass(), "getArchiveBaseName"); - if (method != null) { - return ((Property) method.invoke(task)).get(); - } - } - catch (Exception ex) { - // Continue - } - return task.getBaseName(); - } - - private static Method findMethod(Class type, String name) { - for (Method candidate : type.getMethods()) { - if (candidate.getName().equals(name)) { - return candidate; - } - } - return null; - } - } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java index 10433d672cc..75e3eb0f875 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java @@ -85,8 +85,8 @@ public class SpringBootPlugin implements Plugin { } private void verifyGradleVersion() { - if (GradleVersion.current().compareTo(GradleVersion.version("4.10")) < 0) { - throw new GradleException("Spring Boot plugin requires Gradle 4.10 or later. The current version is " + if (GradleVersion.current().compareTo(GradleVersion.version("5.6")) < 0) { + throw new GradleException("Spring Boot plugin requires Gradle 5.6 or later. The current version is " + GradleVersion.current()); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchiveSupport.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchiveSupport.java index ed951bee5a8..f2c037dff32 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchiveSupport.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchiveSupport.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Method; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -38,7 +37,6 @@ import org.gradle.api.java.archives.Attributes; import org.gradle.api.specs.Spec; import org.gradle.api.specs.Specs; import org.gradle.api.tasks.WorkResult; -import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.util.PatternSet; @@ -95,37 +93,16 @@ class BootArchiveSupport { } CopyAction createCopyAction(Jar jar) { - CopyAction copyAction = new BootZipCopyAction(getOutputLocation(jar), jar.isPreserveFileTimestamps(), - isUsingDefaultLoader(jar), this.requiresUnpack.getAsSpec(), this.exclusions.getAsExcludeSpec(), - this.launchScript, this.compressionResolver, jar.getMetadataCharset()); + CopyAction copyAction = new BootZipCopyAction(jar.getArchiveFile().get().getAsFile(), + jar.isPreserveFileTimestamps(), isUsingDefaultLoader(jar), this.requiresUnpack.getAsSpec(), + this.exclusions.getAsExcludeSpec(), this.launchScript, this.compressionResolver, + jar.getMetadataCharset()); if (!jar.isReproducibleFileOrder()) { return copyAction; } return new ReproducibleOrderingCopyAction(copyAction); } - private static File getOutputLocation(AbstractArchiveTask task) { - try { - Method method = findMethod(task.getClass(), "getArchiveFile"); - if (method != null) { - return (File) method.invoke(task); - } - } - catch (Exception ex) { - // Continue - } - return task.getArchivePath(); - } - - private static Method findMethod(Class type, String name) { - for (Method candidate : type.getMethods()) { - if (candidate.getName().equals(name)) { - return candidate; - } - } - return null; - } - private boolean isUsingDefaultLoader(Jar jar) { return DEFAULT_LAUNCHER_CLASSES.contains(jar.getManifest().getAttributes().get("Main-Class")); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfiguration.java index 343d9935abf..cc358f31e20 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfiguration.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfiguration.java @@ -19,13 +19,11 @@ package org.springframework.boot.gradle.tasks.bundling; import java.io.File; import java.io.IOException; import java.io.Serializable; -import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import org.gradle.api.Project; -import org.gradle.api.provider.Property; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.springframework.boot.loader.tools.FileUtils; @@ -52,35 +50,12 @@ public class LaunchScriptConfiguration implements Serializable { LaunchScriptConfiguration(AbstractArchiveTask archiveTask) { Project project = archiveTask.getProject(); - String baseName = getArchiveBaseName(archiveTask); + String baseName = archiveTask.getArchiveBaseName().get(); putIfMissing(this.properties, "initInfoProvides", baseName); putIfMissing(this.properties, "initInfoShortDescription", removeLineBreaks(project.getDescription()), baseName); putIfMissing(this.properties, "initInfoDescription", augmentLineBreaks(project.getDescription()), baseName); } - @SuppressWarnings("unchecked") - private static String getArchiveBaseName(AbstractArchiveTask task) { - try { - Method method = findMethod(task.getClass(), "getArchiveBaseName"); - if (method != null) { - return ((Property) method.invoke(task)).get(); - } - } - catch (Exception ex) { - // Continue - } - return task.getBaseName(); - } - - private static Method findMethod(Class type, String name) { - for (Method candidate : type.getMethods()) { - if (candidate.getName().equals(name)) { - return candidate; - } - } - return null; - } - /** * Returns the properties that are applied to the launch script when it's being * including in the executable archive. diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java index cf666000e73..0bcfbf1e9eb 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java @@ -43,9 +43,9 @@ class RunningDocumentationTests { @TestTemplate @DisabledOnJre(JRE.JAVA_13) void bootRunMain() throws IOException { - // TODO Testing of convention mappings is flakey in 5.2+ + // Testing of convention mappings is flakey between 5.2 and 6.0 inclusive // https://github.com/gradle/gradle/issues/11323 - assertThat(this.gradleBuild.gradleVersion("5.1.1").script("src/docs/gradle/running/boot-run-main") + assertThat(this.gradleBuild.gradleVersion("6.1-rc-2").script("src/docs/gradle/running/boot-run-main") .build("configuredMainClass").getOutput()).contains("com.example.ExampleApplication"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java index 8d84f1dc6fa..0e063f525a0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java @@ -47,8 +47,7 @@ public final class GradleCompatibilityExtension implements TestTemplateInvocatio GRADLE_VERSIONS = Collections.singletonList("default"); } else { - GRADLE_VERSIONS = Arrays.asList("4.10.3", "5.0", "5.1.1", "5.2.1", "5.3.1", "5.4.1", "5.5.1", "5.6.4", - "default"); + GRADLE_VERSIONS = Arrays.asList("5.6.4", "default"); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java index f531c774739..b5f84528e95 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginIntegrationTests.java @@ -40,19 +40,19 @@ class SpringBootPluginIntegrationTests { @Test void failFastWithVersionOfGradleLowerThanRequired() { - BuildResult result = this.gradleBuild.gradleVersion("4.9").buildAndFail(); + BuildResult result = this.gradleBuild.gradleVersion("5.5.1").buildAndFail(); assertThat(result.getOutput()) - .contains("Spring Boot plugin requires Gradle 4.10 or later. The current version is Gradle 4.9"); + .contains("Spring Boot plugin requires Gradle 5.6 or later. The current version is Gradle 5.5.1"); } @Test void succeedWithVersionOfGradleHigherThanRequired() { - this.gradleBuild.gradleVersion("4.10.1").build(); + this.gradleBuild.gradleVersion("5.6.1").build(); } @Test void succeedWithVersionOfGradleMatchingWhatIsRequired() { - this.gradleBuild.gradleVersion("4.10").build(); + this.gradleBuild.gradleVersion("5.6").build(); } @Test diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java index 895cde6b3dd..248a89142f7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java @@ -53,6 +53,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoShortDescriptionUsesDescriptionByDefault() { given(this.project.getDescription()).willReturn("Project description"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoShortDescription", "Project description"); } @@ -68,6 +70,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoShortDescriptionUsesSingleLineVersionOfMultiLineProjectDescription() { given(this.project.getDescription()).willReturn("Project\ndescription"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoShortDescription", "Project description"); } @@ -83,6 +87,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoDescriptionUsesProjectDescriptionByDefault() { given(this.project.getDescription()).willReturn("Project description"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoDescription", "Project description"); } @@ -90,6 +96,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoDescriptionUsesCorrectlyFormattedMultiLineProjectDescription() { given(this.project.getDescription()).willReturn("The\nproject\ndescription"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoDescription", "The\n# project\n# description"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java index b41e1a04d30..a89a6ded9d9 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/GradleBuild.java @@ -149,9 +149,6 @@ public class GradleBuild { if (this.gradleVersion != null) { gradleRunner.withGradleVersion(this.gradleVersion); } - else if (this.dsl == Dsl.KOTLIN) { - gradleRunner.withGradleVersion("4.10.3"); - } List allArguments = new ArrayList<>(); allArguments.add("-PbootVersion=" + getBootVersion()); allArguments.add("--stacktrace");