diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchive.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchive.java index ac6dcb8a1d8..02208681b27 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchive.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchive.java @@ -25,6 +25,7 @@ import org.gradle.api.provider.Property; import org.gradle.api.specs.Spec; import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.Optional; /** @@ -63,7 +64,7 @@ public interface BootArchive extends Task { * @return the launch script configuration, or {@code null} if the launch script has * not been configured. */ - @Input + @Nested @Optional LaunchScriptConfiguration getLaunchScript(); 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 bc965fc519a..b53ef7b5ad3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -17,17 +17,19 @@ package org.springframework.boot.gradle.tasks.bundling; import java.io.File; -import java.io.IOException; import java.io.Serializable; -import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; import java.util.regex.Pattern; import org.gradle.api.Project; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.bundling.AbstractArchiveTask; -import org.springframework.boot.loader.tools.FileUtils; - /** * Encapsulates the configuration of the launch script for an executable jar or war. * @@ -41,7 +43,9 @@ public class LaunchScriptConfiguration implements Serializable { private static final Pattern LINE_FEED_PATTERN = Pattern.compile("\n"); - private final Map properties = new HashMap<>(); + // We don't care about the order, but Gradle's configuration cache currently does. + // https://github.com/gradle/gradle/pull/17863 + private final Map properties = new TreeMap<>(); private File script; @@ -61,6 +65,7 @@ public class LaunchScriptConfiguration implements Serializable { * including in the executable archive. * @return the properties */ + @Input public Map getProperties() { return this.properties; } @@ -79,6 +84,9 @@ public class LaunchScriptConfiguration implements Serializable { * When {@code null}, the default launch script will be used. * @return the script file */ + @Optional + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) public File getScript() { return this.script; } @@ -92,47 +100,6 @@ public class LaunchScriptConfiguration implements Serializable { this.script = script; } - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - LaunchScriptConfiguration other = (LaunchScriptConfiguration) obj; - if (!this.properties.equals(other.properties)) { - return false; - } - if (this.script == null) { - return other.script == null; - } - else if (!this.script.equals(other.script)) { - return false; - } - else { - return equalContents(this.script, other.script); - } - } - - private boolean equalContents(File one, File two) { - try { - return FileUtils.sha1Hash(one).equals(FileUtils.sha1Hash(two)); - } - catch (IOException ex) { - return false; - } - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.properties.hashCode(); - result = prime * result + ((this.script == null) ? 0 : this.script.hashCode()); - return result; - } - private String removeLineBreaks(String string) { return (string != null) ? WHITE_SPACE_PATTERN.matcher(string).replaceAll(" ") : null; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java deleted file mode 100644 index fe2ee65dd4a..00000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2012-2021 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.gradle.junit; - -import java.util.Collections; -import java.util.List; - -import org.junit.jupiter.api.extension.ConditionEvaluationResult; -import org.junit.jupiter.api.extension.ExecutionCondition; -import org.junit.jupiter.api.extension.Extension; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.TestTemplateInvocationContext; - -/** - * {@link TestTemplateInvocationContext} that disables tests. - * - * @author Christoph Dreis - */ -final class DisabledTemplateInvocationContext implements TestTemplateInvocationContext { - - @Override - public List getAdditionalExtensions() { - return Collections.singletonList(new DisabledCondition()); - } - - private static class DisabledCondition implements ExecutionCondition { - - @Override - public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { - return ConditionEvaluationResult.disabled(""); - } - - } - -} 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 f79578ea53b..ce30517e0f0 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,9 +47,6 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { - if (GRADLE_VERSIONS.isEmpty()) { - return Stream.of(new DisabledTemplateInvocationContext()); - } Stream gradleVersions = GRADLE_VERSIONS.stream(); GradleCompatibility gradleCompatibility = AnnotationUtils .findAnnotation(context.getRequiredTestClass(), GradleCompatibility.class).get(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java index 09bddcf801f..9cebd901210 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java @@ -20,7 +20,6 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Stream; -import org.gradle.api.JavaVersion; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.ExtensionContext; @@ -43,9 +42,6 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { - if (JavaVersion.current() == JavaVersion.VERSION_17) { - return Stream.of(new DisabledTemplateInvocationContext()); - } return Stream.of(Dsl.values()).map(DslTestTemplateInvocationContext::new); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java deleted file mode 100644 index 4fee624902a..00000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2012-2021 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.gradle.junit; - -import java.io.File; - -import org.gradle.api.JavaVersion; -import org.gradle.api.Project; -import org.gradle.internal.nativeintegration.services.NativeServices; -import org.gradle.testfixtures.ProjectBuilder; -import org.gradle.testfixtures.internal.ProjectBuilderImpl; - -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * Helper class to build Gradle {@link Project Projects} for test fixtures. Wraps - * functionality of Gradle's own {@link ProjectBuilder} in order to workaround an issue on - * JDK 17. - * - * @author Christoph Dreis - * @see Gradle Support JDK 17 - */ -public final class GradleProjectBuilder { - - private File projectDir; - - private String name; - - private GradleProjectBuilder() { - } - - public static GradleProjectBuilder builder() { - return new GradleProjectBuilder(); - } - - public GradleProjectBuilder withProjectDir(File dir) { - this.projectDir = dir; - return this; - } - - public GradleProjectBuilder withName(String name) { - this.name = name; - return this; - } - - public Project build() { - Assert.notNull(this.projectDir, "ProjectDir must not be null"); - ProjectBuilder builder = ProjectBuilder.builder(); - builder.withProjectDir(this.projectDir); - File userHome = new File(this.projectDir, "userHome"); - builder.withGradleUserHomeDir(userHome); - if (StringUtils.hasText(this.name)) { - builder.withName(this.name); - } - if (JavaVersion.current() == JavaVersion.VERSION_17) { - NativeServices.initialize(userHome); - try { - ProjectBuilderImpl.getGlobalServices(); - } - catch (Throwable ignore) { - } - } - return builder.build(); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java index 072baa977d2..7787dfb2e33 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java @@ -20,10 +20,10 @@ import java.io.File; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +42,7 @@ class SpringBootPluginTests { @Test void bootArchivesConfigurationsCannotBeResolved() { - Project project = GradleProjectBuilder.builder().withProjectDir(this.temp).build(); + Project project = ProjectBuilder.builder().withProjectDir(this.temp).build(); project.getPlugins().apply(SpringBootPlugin.class); Configuration bootArchives = project.getConfigurations() .getByName(SpringBootPlugin.BOOT_ARCHIVES_CONFIGURATION_NAME); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java index 61d2629dfd2..55fb21094dc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java @@ -26,10 +26,10 @@ import java.util.Properties; import org.gradle.api.Project; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.initialization.GradlePropertiesController; +import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import static org.assertj.core.api.Assertions.assertThat; @@ -131,7 +131,7 @@ class BuildInfoTests { private Project createProject(String projectName) { File projectDir = new File(this.temp, projectName); - Project project = GradleProjectBuilder.builder().withProjectDir(projectDir).withName(projectName).build(); + Project project = ProjectBuilder.builder().withProjectDir(projectDir).withName(projectName).build(); ((ProjectInternal) project).getServices().get(GradlePropertiesController.class) .loadGradlePropertiesFrom(projectDir); return project; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java index fb23adb6bde..11aa0cf92c0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java @@ -61,11 +61,11 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier; import org.gradle.api.internal.file.archive.ZipCopyAction; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Jar; +import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.loader.tools.DefaultLaunchScript; import org.springframework.boot.loader.tools.JarModeLibrary; @@ -115,7 +115,7 @@ abstract class AbstractBootArchiveTests { try { File projectDir = new File(this.temp, "project"); projectDir.mkdirs(); - this.project = GradleProjectBuilder.builder().withProjectDir(projectDir).build(); + this.project = ProjectBuilder.builder().withProjectDir(projectDir).build(); this.project.setDescription("Test project for " + this.taskClass.getSimpleName()); this.task = configure(this.project.getTasks().create("testArchive", this.taskClass)); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java index 31d2d10dd8a..23836fa57ed 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java @@ -24,6 +24,7 @@ import java.util.Map; import org.gradle.api.GradleException; import org.gradle.api.JavaVersion; import org.gradle.api.Project; +import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -31,7 +32,6 @@ import org.springframework.boot.buildpack.platform.build.BuildRequest; import org.springframework.boot.buildpack.platform.build.BuildpackReference; import org.springframework.boot.buildpack.platform.build.PullPolicy; import org.springframework.boot.buildpack.platform.docker.type.Binding; -import org.springframework.boot.gradle.junit.GradleProjectBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -55,7 +55,7 @@ class BootBuildImageTests { BootBuildImageTests() { File projectDir = new File(this.temp, "project"); projectDir.mkdirs(); - this.project = GradleProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); + this.project = ProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); this.project.setDescription("Test project for BootBuildImage"); this.buildImage = this.project.getTasks().create("buildImage", BootBuildImage.class); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleVersions.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleVersions.java index 28a8a793cc6..67195beeefa 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleVersions.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleVersions.java @@ -35,7 +35,7 @@ public final class GradleVersions { public static List allCompatible() { if (isJava17()) { - return Collections.emptyList(); + return Collections.singletonList("7.2-rc-1"); } if (isJava16()) { return Arrays.asList("7.0.2", "7.1"); @@ -44,6 +44,9 @@ public final class GradleVersions { } public static String currentOrMinimumCompatible() { + if (isJava17()) { + return "7.2-rc-1"; + } if (isJava16()) { return "7.0.2"; }