From 7cd87acd733605d2d7dd959edc00965d43865b38 Mon Sep 17 00:00:00 2001 From: Lars Grefer Date: Mon, 14 Feb 2022 00:50:04 +0100 Subject: [PATCH 1/2] Avoid using Gradle APIs that trigger eager task creation See gh-29762 --- .../plugin/ApplicationPluginAction.java | 44 ++++++++++--------- .../boot/gradle/plugin/JavaPluginAction.java | 17 +++---- .../gradle/plugin/KotlinPluginAction.java | 4 +- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java index 5fbffeaa873..ab7fab8c39c 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java @@ -31,6 +31,7 @@ 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.tasks.TaskProvider; import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator; import org.gradle.jvm.application.tasks.CreateStartScripts; @@ -49,26 +50,29 @@ final class ApplicationPluginAction implements PluginApplicationAction { Distribution distribution = distributions.create("boot"); distribution.getDistributionBaseName() .convention((project.provider(() -> applicationConvention.getApplicationName() + "-boot"))); - CreateStartScripts bootStartScripts = project.getTasks().create("bootStartScripts", CreateStartScripts.class); - bootStartScripts - .setDescription("Generates OS-specific start scripts to run the project as a Spring Boot application."); - ((TemplateBasedScriptGenerator) bootStartScripts.getUnixStartScriptGenerator()) - .setTemplate(project.getResources().getText().fromString(loadResource("/unixStartScript.txt"))); - ((TemplateBasedScriptGenerator) bootStartScripts.getWindowsStartScriptGenerator()) - .setTemplate(project.getResources().getText().fromString(loadResource("/windowsStartScript.txt"))); - project.getConfigurations().all((configuration) -> { - if ("bootArchives".equals(configuration.getName())) { - CopySpec libCopySpec = project.copySpec().into("lib") - .from((Callable) () -> configuration.getArtifacts().getFiles()); - libCopySpec.setFileMode(0644); - distribution.getContents().with(libCopySpec); - bootStartScripts.setClasspath(configuration.getArtifacts().getFiles()); - } - }); - bootStartScripts.getConventionMapping().map("outputDir", () -> new File(project.getBuildDir(), "bootScripts")); - bootStartScripts.getConventionMapping().map("applicationName", applicationConvention::getApplicationName); - bootStartScripts.getConventionMapping().map("defaultJvmOpts", - applicationConvention::getApplicationDefaultJvmArgs); + TaskProvider bootStartScripts = project.getTasks().register("bootStartScripts", + CreateStartScripts.class, (bss) -> { + bss.setDescription( + "Generates OS-specific start scripts to run the project as a Spring Boot application."); + ((TemplateBasedScriptGenerator) bss.getUnixStartScriptGenerator()).setTemplate( + project.getResources().getText().fromString(loadResource("/unixStartScript.txt"))); + ((TemplateBasedScriptGenerator) bss.getWindowsStartScriptGenerator()).setTemplate( + project.getResources().getText().fromString(loadResource("/windowsStartScript.txt"))); + + project.getConfigurations().all((configuration) -> { + if ("bootArchives".equals(configuration.getName())) { + CopySpec libCopySpec = project.copySpec().into("lib") + .from((Callable) () -> configuration.getArtifacts().getFiles()); + libCopySpec.setFileMode(0644); + distribution.getContents().with(libCopySpec); + bss.setClasspath(configuration.getArtifacts().getFiles()); + } + }); + bss.getConventionMapping().map("outputDir", () -> new File(project.getBuildDir(), "bootScripts")); + bss.getConventionMapping().map("applicationName", applicationConvention::getApplicationName); + bss.getConventionMapping().map("defaultJvmOpts", + applicationConvention::getApplicationDefaultJvmArgs); + }); CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts); binCopySpec.setFileMode(0755); distribution.getContents().with(binCopySpec); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java index 0b8c8fb80ab..a9ea3fd4c97 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java @@ -167,15 +167,16 @@ final class JavaPluginAction implements PluginApplicationAction { } private void configureUtf8Encoding(Project project) { - project.afterEvaluate((evaluated) -> evaluated.getTasks().withType(JavaCompile.class, (compile) -> { - if (compile.getOptions().getEncoding() == null) { - compile.getOptions().setEncoding("UTF-8"); - } - })); + project.afterEvaluate( + (evaluated) -> evaluated.getTasks().withType(JavaCompile.class).configureEach((compile) -> { + if (compile.getOptions().getEncoding() == null) { + compile.getOptions().setEncoding("UTF-8"); + } + })); } private void configureParametersCompilerArg(Project project) { - project.getTasks().withType(JavaCompile.class, (compile) -> { + project.getTasks().withType(JavaCompile.class).configureEach((compile) -> { List compilerArgs = compile.getOptions().getCompilerArgs(); if (!compilerArgs.contains(PARAMETERS_COMPILER_ARG)) { compilerArgs.add(PARAMETERS_COMPILER_ARG); @@ -184,8 +185,8 @@ final class JavaPluginAction implements PluginApplicationAction { } private void configureAdditionalMetadataLocations(Project project) { - project.afterEvaluate((evaluated) -> evaluated.getTasks().withType(JavaCompile.class, - this::configureAdditionalMetadataLocations)); + project.afterEvaluate((evaluated) -> evaluated.getTasks().withType(JavaCompile.class) + .configureEach(this::configureAdditionalMetadataLocations)); } private void configureAdditionalMetadataLocations(JavaCompile compile) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java index 06774b3075d..60ce2785d20 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java @@ -47,8 +47,8 @@ class KotlinPluginAction implements PluginApplicationAction { } private void enableJavaParametersOption(Project project) { - project.getTasks().withType(KotlinCompile.class, - (compile) -> compile.getKotlinOptions().setJavaParameters(true)); + project.getTasks().withType(KotlinCompile.class) + .configureEach((compile) -> compile.getKotlinOptions().setJavaParameters(true)); } @Override From c84b35c460f100c3f3702b1a59192e4071263a26 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 15 Feb 2022 08:36:29 +0000 Subject: [PATCH 2/2] Polish "Avoid using Gradle APIs that trigger eager task creation" See gh-29762 --- .../plugin/ApplicationPluginAction.java | 48 ++++++++++--------- .../gradle/plugin/KotlinPluginAction.java | 2 +- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java index ab7fab8c39c..0c373d5b574 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java @@ -51,33 +51,37 @@ final class ApplicationPluginAction implements PluginApplicationAction { distribution.getDistributionBaseName() .convention((project.provider(() -> applicationConvention.getApplicationName() + "-boot"))); TaskProvider bootStartScripts = project.getTasks().register("bootStartScripts", - CreateStartScripts.class, (bss) -> { - bss.setDescription( - "Generates OS-specific start scripts to run the project as a Spring Boot application."); - ((TemplateBasedScriptGenerator) bss.getUnixStartScriptGenerator()).setTemplate( - project.getResources().getText().fromString(loadResource("/unixStartScript.txt"))); - ((TemplateBasedScriptGenerator) bss.getWindowsStartScriptGenerator()).setTemplate( - project.getResources().getText().fromString(loadResource("/windowsStartScript.txt"))); - - project.getConfigurations().all((configuration) -> { - if ("bootArchives".equals(configuration.getName())) { - CopySpec libCopySpec = project.copySpec().into("lib") - .from((Callable) () -> configuration.getArtifacts().getFiles()); - libCopySpec.setFileMode(0644); - distribution.getContents().with(libCopySpec); - bss.setClasspath(configuration.getArtifacts().getFiles()); - } - }); - bss.getConventionMapping().map("outputDir", () -> new File(project.getBuildDir(), "bootScripts")); - bss.getConventionMapping().map("applicationName", applicationConvention::getApplicationName); - bss.getConventionMapping().map("defaultJvmOpts", - applicationConvention::getApplicationDefaultJvmArgs); - }); + CreateStartScripts.class, + (task) -> configureCreateStartScripts(project, applicationConvention, distribution, task)); CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts); binCopySpec.setFileMode(0755); distribution.getContents().with(binCopySpec); } + private void configureCreateStartScripts(Project project, ApplicationPluginConvention applicationConvention, + Distribution distribution, CreateStartScripts createStartScripts) { + createStartScripts + .setDescription("Generates OS-specific start scripts to run the project as a Spring Boot application."); + ((TemplateBasedScriptGenerator) createStartScripts.getUnixStartScriptGenerator()) + .setTemplate(project.getResources().getText().fromString(loadResource("/unixStartScript.txt"))); + ((TemplateBasedScriptGenerator) createStartScripts.getWindowsStartScriptGenerator()) + .setTemplate(project.getResources().getText().fromString(loadResource("/windowsStartScript.txt"))); + project.getConfigurations().all((configuration) -> { + if ("bootArchives".equals(configuration.getName())) { + CopySpec libCopySpec = project.copySpec().into("lib") + .from((Callable) () -> configuration.getArtifacts().getFiles()); + libCopySpec.setFileMode(0644); + distribution.getContents().with(libCopySpec); + createStartScripts.setClasspath(configuration.getArtifacts().getFiles()); + } + }); + createStartScripts.getConventionMapping().map("outputDir", + () -> new File(project.getBuildDir(), "bootScripts")); + createStartScripts.getConventionMapping().map("applicationName", applicationConvention::getApplicationName); + createStartScripts.getConventionMapping().map("defaultJvmOpts", + applicationConvention::getApplicationDefaultJvmArgs); + } + @Override public Class> getPluginClass() { return ApplicationPlugin.class; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java index 60ce2785d20..a4bce532bd0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java @@ -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.