Raise the minimum supported version of Gradle to 5.6
Closes gh-18777
This commit is contained in:
parent
3bd9eea079
commit
e415f759a2
|
@ -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])
|
||||
|
|
|
@ -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 <<using-spring-boot.adoc#using-boot-maven-without-a-parent>>
|
|||
|
||||
[[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`.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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<String>) 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -85,8 +85,8 @@ public class SpringBootPlugin implements Plugin<Project> {
|
|||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
|
@ -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<String>) 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.
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -53,6 +53,8 @@ class LaunchScriptConfigurationTests {
|
|||
@Test
|
||||
void initInfoShortDescriptionUsesDescriptionByDefault() {
|
||||
given(this.project.getDescription()).willReturn("Project description");
|
||||
Property<String> 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<String> 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<String> 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<String> baseName = stringProperty("base-name");
|
||||
given(this.task.getArchiveBaseName()).willReturn(baseName);
|
||||
assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoDescription",
|
||||
"The\n# project\n# description");
|
||||
}
|
||||
|
|
|
@ -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<String> allArguments = new ArrayList<>();
|
||||
allArguments.add("-PbootVersion=" + getBootVersion());
|
||||
allArguments.add("--stacktrace");
|
||||
|
|
Loading…
Reference in New Issue