Build with Gradle 7.5 while still supporting Gradle 6.8+

Closes gh-32281
This commit is contained in:
Andy Wilkinson
2022-09-09 13:04:06 +01:00
parent 6d0a504283
commit 78f4242e46
36 changed files with 198 additions and 115 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 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.
@@ -22,9 +22,9 @@ 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.SourceSetContainer;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.tasks.Jar;
@@ -112,8 +112,12 @@ public class SpringBootExtension {
}
private File determineMainSourceSetResourcesOutputDir() {
return this.project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets()
.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getResourcesDir();
return sourceSets(this.project).getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getResourcesDir();
}
@SuppressWarnings("deprecation")
private SourceSetContainer sourceSets(Project project) {
return project.getConvention().getPlugin(org.gradle.api.plugins.JavaPluginConvention.class).getSourceSets();
}
private String determineArtifactBaseName() {

View File

@@ -31,7 +31,7 @@ import org.gradle.api.distribution.DistributionContainer;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.FileCollection;
import org.gradle.api.plugins.ApplicationPlugin;
import org.gradle.api.plugins.ApplicationPluginConvention;
import org.gradle.api.plugins.JavaApplication;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator;
import org.gradle.jvm.application.tasks.CreateStartScripts;
@@ -45,21 +45,20 @@ final class ApplicationPluginAction implements PluginApplicationAction {
@Override
public void execute(Project project) {
ApplicationPluginConvention applicationConvention = project.getConvention()
.getPlugin(ApplicationPluginConvention.class);
JavaApplication javaApplication = project.getExtensions().getByType(JavaApplication.class);
DistributionContainer distributions = project.getExtensions().getByType(DistributionContainer.class);
Distribution distribution = distributions.create("boot");
distribution.getDistributionBaseName()
.convention((project.provider(() -> applicationConvention.getApplicationName() + "-boot")));
.convention((project.provider(() -> javaApplication.getApplicationName() + "-boot")));
TaskProvider<CreateStartScripts> bootStartScripts = project.getTasks().register("bootStartScripts",
CreateStartScripts.class,
(task) -> configureCreateStartScripts(project, applicationConvention, distribution, task));
(task) -> configureCreateStartScripts(project, javaApplication, distribution, task));
CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts);
binCopySpec.setFileMode(0755);
distribution.getContents().with(binCopySpec);
}
private void configureCreateStartScripts(Project project, ApplicationPluginConvention applicationConvention,
private void configureCreateStartScripts(Project project, JavaApplication javaApplication,
Distribution distribution, CreateStartScripts createStartScripts) {
createStartScripts
.setDescription("Generates OS-specific start scripts to run the project as a Spring Boot application.");
@@ -75,9 +74,8 @@ final class ApplicationPluginAction implements PluginApplicationAction {
});
createStartScripts.getConventionMapping().map("outputDir",
() -> new File(project.getBuildDir(), "bootScripts"));
createStartScripts.getConventionMapping().map("applicationName", applicationConvention::getApplicationName);
createStartScripts.getConventionMapping().map("defaultJvmOpts",
applicationConvention::getApplicationDefaultJvmArgs);
createStartScripts.getConventionMapping().map("applicationName", javaApplication::getApplicationName);
createStartScripts.getConventionMapping().map("defaultJvmOpts", javaApplication::getApplicationDefaultJvmArgs);
}
private CopySpec artifactFilesToLibCopySpec(Project project, Configuration configuration) {

View File

@@ -36,7 +36,6 @@ import org.gradle.api.model.ObjectFactory;
import org.gradle.api.plugins.ApplicationPlugin;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet;
@@ -98,8 +97,7 @@ final class JavaPluginAction implements PluginApplicationAction {
}
private TaskProvider<BootJar> configureBootJarTask(Project project) {
SourceSet mainSourceSet = javaPluginConvention(project).getSourceSets()
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
SourceSet mainSourceSet = sourceSets(project).getByName(SourceSet.MAIN_SOURCE_SET_NAME);
Configuration developmentOnly = project.getConfigurations()
.getByName(SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME);
Configuration productionRuntimeClasspath = project.getConfigurations()
@@ -125,8 +123,8 @@ final class JavaPluginAction implements PluginApplicationAction {
buildImage.setDescription("Builds an OCI image of the application using the output of the bootJar task");
buildImage.setGroup(BasePlugin.BUILD_GROUP);
buildImage.getArchiveFile().set(bootJar.get().getArchiveFile());
buildImage.getTargetJavaVersion()
.set(project.provider(() -> javaPluginConvention(project).getTargetCompatibility()));
buildImage.getTargetJavaVersion().set(project.provider(
() -> project.getExtensions().getByType(JavaPluginExtension.class).getTargetCompatibility()));
});
}
@@ -135,8 +133,8 @@ final class JavaPluginAction implements PluginApplicationAction {
}
private void configureBootRunTask(Project project) {
Callable<FileCollection> classpath = () -> javaPluginConvention(project).getSourceSets()
.findByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath().filter(new JarTypeFileSpec());
Callable<FileCollection> classpath = () -> sourceSets(project).findByName(SourceSet.MAIN_SOURCE_SET_NAME)
.getRuntimeClasspath().filter(new JarTypeFileSpec());
TaskProvider<ResolveMainClassName> resolveProvider = ResolveMainClassName.registerForTask("bootRun", project,
classpath);
project.getTasks().register("bootRun", BootRun.class, (run) -> {
@@ -160,8 +158,9 @@ final class JavaPluginAction implements PluginApplicationAction {
run.getJavaLauncher().convention(toolchainService.launcherFor(toolchain));
}
private JavaPluginConvention javaPluginConvention(Project project) {
return project.getConvention().getPlugin(JavaPluginConvention.class);
@SuppressWarnings("deprecation")
private SourceSetContainer sourceSets(Project project) {
return project.getConvention().getPlugin(org.gradle.api.plugins.JavaPluginConvention.class).getSourceSets();
}
private void configureUtf8Encoding(Project evaluatedProject) {
@@ -189,9 +188,8 @@ final class JavaPluginAction implements PluginApplicationAction {
}
private void configureAdditionalMetadataLocations(JavaCompile compile) {
SourceSetContainer sourceSets = compile.getProject().getConvention().getPlugin(JavaPluginConvention.class)
.getSourceSets();
sourceSets.stream().filter((candidate) -> candidate.getCompileJavaTaskName().equals(compile.getName()))
sourceSets(compile.getProject()).stream()
.filter((candidate) -> candidate.getCompileJavaTaskName().equals(compile.getName()))
.map((match) -> match.getResources().getSrcDirs()).findFirst()
.ifPresent((locations) -> compile.doFirst(new AdditionalMetadataLocationsConfigurer(locations)));
}

View File

@@ -17,10 +17,11 @@
package org.springframework.boot.gradle.plugin;
import org.gradle.api.Action;
import org.gradle.api.GradleException;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.repositories.ArtifactRepository;
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
import org.gradle.api.tasks.Upload;
/**
* {@link Action} that is executed in response to the
@@ -46,7 +47,7 @@ final class MavenPluginAction implements PluginApplicationAction {
@Override
public void execute(Project project) {
project.afterEvaluate((evaluated) -> {
project.getTasks().withType(Upload.class).configureEach((upload) -> {
project.getTasks().withType(org.gradle.api.tasks.Upload.class).configureEach((upload) -> {
if (this.uploadTaskName.equals(upload.getName())) {
clearConfigurationMappings(upload);
}
@@ -54,9 +55,28 @@ final class MavenPluginAction implements PluginApplicationAction {
});
}
private void clearConfigurationMappings(Upload upload) {
upload.getRepositories().withType(org.gradle.api.artifacts.maven.MavenResolver.class,
(resolver) -> resolver.getPom().getScopeMappings().getMappings().clear());
private void clearConfigurationMappings(org.gradle.api.tasks.Upload upload) {
upload.getRepositories().matching(this::isMavenResolver).all((resolver) -> {
try {
Object pom = resolver.getClass().getMethod("getPom").invoke(resolver);
Object scopeMappings = pom.getClass().getMethod("getScopeMappings").invoke(pom);
Object mappings = scopeMappings.getClass().getMethod("getMappings").invoke(scopeMappings);
mappings.getClass().getMethod("clear").invoke(mappings);
}
catch (Exception ex) {
throw new GradleException("Failed to clear configuration mappings for task '" + upload.getName() + "'",
ex);
}
});
}
private boolean isMavenResolver(ArtifactRepository repository) {
for (Class<?> iface : repository.getClass().getInterfaces()) {
if ("org.gradle.api.artifacts.maven.GroovyMavenDeployer".equals(iface.getName())) {
return true;
}
}
return false;
}
}

View File

@@ -34,7 +34,6 @@ import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFile;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.Convention;
import org.gradle.api.plugins.JavaApplication;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
@@ -44,6 +43,7 @@ import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.work.DisableCachingByDefault;
import org.springframework.boot.gradle.dsl.SpringBootExtension;
import org.springframework.boot.loader.tools.MainClassFinder;
@@ -54,6 +54,7 @@ import org.springframework.boot.loader.tools.MainClassFinder;
* @author Andy Wilkinson
* @since 2.4
*/
@DisableCachingByDefault(because = "Not worth caching")
public class ResolveMainClassName extends DefaultTask {
private static final String SPRING_BOOT_APPLICATION_CLASS_NAME = "org.springframework.boot.autoconfigure.SpringBootApplication";
@@ -156,13 +157,12 @@ public class ResolveMainClassName extends DefaultTask {
Callable<FileCollection> classpath) {
TaskProvider<ResolveMainClassName> resolveMainClassNameProvider = project.getTasks()
.register(taskName + "MainClassName", ResolveMainClassName.class, (resolveMainClassName) -> {
Convention convention = project.getConvention();
resolveMainClassName.setDescription(
"Resolves the name of the application's main class for the " + taskName + " task.");
resolveMainClassName.setGroup(BasePlugin.BUILD_GROUP);
resolveMainClassName.setClasspath(classpath);
resolveMainClassName.getConfiguredMainClassName().convention(project.provider(() -> {
String javaApplicationMainClass = getJavaApplicationMainClass(convention);
String javaApplicationMainClass = getJavaApplicationMainClass(project);
if (javaApplicationMainClass != null) {
return javaApplicationMainClass;
}
@@ -176,8 +176,8 @@ public class ResolveMainClassName extends DefaultTask {
return resolveMainClassNameProvider;
}
private static String getJavaApplicationMainClass(Convention convention) {
JavaApplication javaApplication = convention.findByType(JavaApplication.class);
private static String getJavaApplicationMainClass(Project project) {
JavaApplication javaApplication = project.getExtensions().findByType(JavaApplication.class);
if (javaApplication == null) {
return null;
}

View File

@@ -72,10 +72,9 @@ class WarPluginAction implements PluginApplicationAction {
.getByName(SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME);
Configuration productionRuntimeClasspath = project.getConfigurations()
.getByName(SpringBootPlugin.PRODUCTION_RUNTIME_CLASSPATH_CONFIGURATION_NAME);
Callable<FileCollection> classpath = () -> project.getConvention().getByType(SourceSetContainer.class)
.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath()
.minus(providedRuntimeConfiguration(project)).minus((developmentOnly.minus(productionRuntimeClasspath)))
.filter(new JarTypeFileSpec());
Callable<FileCollection> classpath = () -> sourceSets(project).getByName(SourceSet.MAIN_SOURCE_SET_NAME)
.getRuntimeClasspath().minus(providedRuntimeConfiguration(project))
.minus((developmentOnly.minus(productionRuntimeClasspath))).filter(new JarTypeFileSpec());
TaskProvider<ResolveMainClassName> resolveMainClassName = ResolveMainClassName
.registerForTask(SpringBootPlugin.BOOT_WAR_TASK_NAME, project, classpath);
TaskProvider<BootWar> bootWarProvider = project.getTasks().register(SpringBootPlugin.BOOT_WAR_TASK_NAME,
@@ -95,6 +94,11 @@ class WarPluginAction implements PluginApplicationAction {
return bootWarProvider;
}
@SuppressWarnings("deprecation")
private SourceSetContainer sourceSets(Project project) {
return project.getConvention().getPlugin(org.gradle.api.plugins.JavaPluginConvention.class).getSourceSets();
}
private FileCollection providedRuntimeConfiguration(Project project) {
ConfigurationContainer configurations = project.getConfigurations();
return configurations.getByName(WarPlugin.PROVIDED_RUNTIME_CONFIGURATION_NAME);

View File

@@ -30,6 +30,7 @@ import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.TaskExecutionException;
import org.gradle.work.DisableCachingByDefault;
import org.springframework.boot.loader.tools.BuildPropertiesWriter;
import org.springframework.boot.loader.tools.BuildPropertiesWriter.ProjectDetails;
@@ -41,6 +42,7 @@ import org.springframework.boot.loader.tools.BuildPropertiesWriter.ProjectDetail
* @author Andy Wilkinson
* @since 2.0.0
*/
@DisableCachingByDefault(because = "Not worth caching")
public class BuildInfo extends ConventionTask {
private final BuildInfoProperties properties = new BuildInfoProperties(getProject());

View File

@@ -66,12 +66,17 @@ public class BuildInfoProperties implements Serializable {
}
private Provider<String> projectVersion(Project project) {
Provider<String> externalVersionProperty = project.getProviders().gradleProperty("version")
.forUseAtConfigurationTime();
Provider<String> externalVersionProperty = forUseAtConfigurationTime(
project.getProviders().gradleProperty("version"));
externalVersionProperty.getOrNull();
return project.provider(() -> project.getVersion().toString());
}
@SuppressWarnings("deprecation")
private Provider<String> forUseAtConfigurationTime(Provider<String> provider) {
return provider.forUseAtConfigurationTime();
}
/**
* Returns the value used for the {@code build.group} property. Defaults to the
* {@link Project#getGroup() Project's group}.

View File

@@ -36,7 +36,7 @@ import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.options.Option;
import org.gradle.util.ConfigureUtil;
import org.gradle.work.DisableCachingByDefault;
import org.springframework.boot.buildpack.platform.build.BuildRequest;
import org.springframework.boot.buildpack.platform.build.Builder;
@@ -62,6 +62,7 @@ import org.springframework.util.StringUtils;
* @author Julian Liebig
* @since 2.3.0
*/
@DisableCachingByDefault
public class BootBuildImage extends DefaultTask {
private static final String BUILDPACK_JVM_VERSION_KEY = "BP_JVM_VERSION";
@@ -465,7 +466,7 @@ public class BootBuildImage extends DefaultTask {
* @param closure the closure
*/
public void buildCache(Closure<?> closure) {
buildCache(ConfigureUtil.configureUsing(closure));
buildCache(Closures.asAction(closure));
}
/**
@@ -493,7 +494,7 @@ public class BootBuildImage extends DefaultTask {
* @param closure the closure
*/
public void launchCache(Closure<?> closure) {
launchCache(ConfigureUtil.configureUsing(closure));
launchCache(Closures.asAction(closure));
}
/**
@@ -521,7 +522,7 @@ public class BootBuildImage extends DefaultTask {
* @since 2.4.0
*/
public void docker(Closure<?> closure) {
docker(ConfigureUtil.configureUsing(closure));
docker(Closures.asAction(closure));
}
@TaskAction

View File

@@ -34,6 +34,7 @@ import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.bundling.Jar;
import org.gradle.work.DisableCachingByDefault;
/**
* A custom {@link Jar} task that produces a Spring Boot executable jar.
@@ -44,6 +45,7 @@ import org.gradle.api.tasks.bundling.Jar;
* @author Phillip Webb
* @since 2.0.0
*/
@DisableCachingByDefault(because = "Not worth caching")
public class BootJar extends Jar implements BootArchive {
private static final String LAUNCHER = "org.springframework.boot.loader.JarLauncher";

View File

@@ -35,6 +35,7 @@ import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.bundling.War;
import org.gradle.work.DisableCachingByDefault;
/**
* A custom {@link War} task that produces a Spring Boot executable war.
@@ -43,6 +44,7 @@ import org.gradle.api.tasks.bundling.War;
* @author Phillip Webb
* @since 2.0.0
*/
@DisableCachingByDefault(because = "Not worth caching")
public class BootWar extends War implements BootArchive {
private static final String LAUNCHER = "org.springframework.boot.loader.WarLauncher";

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2021-2021 the original author or authors.
* Copyright 2021-2022 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.
@@ -20,7 +20,6 @@ import groovy.lang.Closure;
import org.gradle.api.Action;
import org.gradle.api.GradleException;
import org.gradle.api.tasks.Input;
import org.gradle.util.ConfigureUtil;
import org.springframework.boot.buildpack.platform.build.Cache;
@@ -62,7 +61,7 @@ public class CacheSpec {
if (this.cache != null) {
throw new GradleException("Each image building cache can be configured only once");
}
volume(ConfigureUtil.configureUsing(closure));
volume(Closures.asAction(closure));
}
/**

View File

@@ -0,0 +1,39 @@
/*
* Copyright 2012-2022 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.tasks.bundling;
import groovy.lang.Closure;
import org.gradle.api.Action;
/**
* Wrapper for the deprecated {@link org.gradle.util.ConfigureUtil} that allows
* deprecation warnings to be suppressed in a single, focused location.
*
* @author Andy Wilkinson
*/
final class Closures {
private Closures() {
}
@SuppressWarnings("deprecation")
static <T> Action<T> asAction(Closure<?> closure) {
return org.gradle.util.ConfigureUtil.configureUsing(closure);
}
}

View File

@@ -22,7 +22,6 @@ import org.gradle.api.GradleException;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.Optional;
import org.gradle.util.ConfigureUtil;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerConfiguration;
@@ -110,7 +109,7 @@ public class DockerSpec {
* @param closure the closure to apply
*/
public void builderRegistry(Closure<?> closure) {
builderRegistry(ConfigureUtil.configureUsing(closure));
builderRegistry(Closures.asAction(closure));
}
/**
@@ -138,7 +137,7 @@ public class DockerSpec {
* @param closure the closure to apply
*/
public void publishRegistry(Closure<?> closure) {
publishRegistry(ConfigureUtil.configureUsing(closure));
publishRegistry(Closures.asAction(closure));
}
/**

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 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.
@@ -27,7 +27,6 @@ import groovy.lang.Closure;
import org.gradle.api.Action;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
import org.gradle.util.ConfigureUtil;
import org.springframework.boot.loader.tools.Layer;
import org.springframework.boot.loader.tools.Layers;
@@ -133,7 +132,7 @@ public class LayeredSpec {
* @param closure the closure
*/
public void application(Closure<?> closure) {
application(ConfigureUtil.configureUsing(closure));
application(Closures.asAction(closure));
}
/**
@@ -168,7 +167,7 @@ public class LayeredSpec {
* @param closure the closure
*/
public void dependencies(Closure<?> closure) {
dependencies(ConfigureUtil.configureUsing(closure));
dependencies(Closures.asAction(closure));
}
/**
@@ -245,7 +244,7 @@ public class LayeredSpec {
}
public void intoLayer(String layer, Closure<?> closure) {
intoLayer(layer, ConfigureUtil.configureUsing(closure));
intoLayer(layer, Closures.asAction(closure));
}
public void intoLayer(String layer, Action<IntoLayerSpec> action) {

View File

@@ -27,6 +27,7 @@ import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetOutput;
import org.gradle.jvm.toolchain.JavaLauncher;
import org.gradle.work.DisableCachingByDefault;
/**
* Custom {@link JavaExec} task for running a Spring Boot application.
@@ -34,6 +35,7 @@ import org.gradle.jvm.toolchain.JavaLauncher;
* @author Andy Wilkinson
* @since 2.0.0
*/
@DisableCachingByDefault(because = "Application should always run")
public class BootRun extends JavaExec {
private boolean optimizedLaunch = true;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 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.
@@ -61,7 +61,7 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro
@Override
public List<Extension> getAdditionalExtensions() {
GradleBuild gradleBuild = new GradleBuild(this.dsl);
gradleBuild.gradleVersion(GradleVersions.currentOrMinimumCompatible());
gradleBuild.gradleVersion(GradleVersions.minimumCompatible());
return Arrays.asList(new GradleBuildFieldSetter(gradleBuild), new GradleBuildExtension());
}

View File

@@ -68,7 +68,7 @@ public final class GradleProjectBuilder {
builder.withName(this.name);
}
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) {
NativeServices.initialize(userHome);
NativeServices.initializeOnClient(userHome);
try {
ProjectBuilderImpl.getGlobalServices();
}