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 e85267f5d0..950901e137 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 cbd79142ff..907d6707b1 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 efe4d2e371..435be27797 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 d1d8e78a41..b94233121c 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 10433d672c..75e3eb0f87 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 ed951bee5a..f2c037dff3 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 343d9935ab..cc358f31e2 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 cf666000e7..0bcfbf1e9e 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 8d84f1dc6f..0e063f525a 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 f531c77473..b5f84528e9 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 895cde6b3d..248a89142f 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 b41e1a04d3..a89a6ded9d 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");