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 new file mode 100644 index 0000000000..4fee624902 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java @@ -0,0 +1,81 @@ +/* + * 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 7787dfb2e3..072baa977d 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 = ProjectBuilder.builder().withProjectDir(this.temp).build(); + Project project = GradleProjectBuilder.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 55fb21094d..61d2629dfd 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 = ProjectBuilder.builder().withProjectDir(projectDir).withName(projectName).build(); + Project project = GradleProjectBuilder.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 0ace9f6fcc..96a14088a1 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 = ProjectBuilder.builder().withProjectDir(projectDir).build(); + this.project = GradleProjectBuilder.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 23836fa57e..31d2d10dd8 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,7 +24,6 @@ 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; @@ -32,6 +31,7 @@ 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 = ProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); + this.project = GradleProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); this.project.setDescription("Test project for BootBuildImage"); this.buildImage = this.project.getTasks().create("buildImage", BootBuildImage.class); }