From c85cc33ca9de96820d494f289db61f8e22986f46 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Sun, 25 Oct 2020 08:05:59 +0000 Subject: [PATCH] Fix main class resolution failure when loaded from config cache See gh-22922 --- .../gradle/plugin/ResolveMainClassName.java | 35 ++++++++++++------- .../AbstractBootArchiveIntegrationTests.java | 2 ++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ResolveMainClassName.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ResolveMainClassName.java index 2a0f489946..2b73b23f96 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ResolveMainClassName.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ResolveMainClassName.java @@ -28,7 +28,9 @@ import org.gradle.api.DefaultTask; import org.gradle.api.InvalidUserDataException; import org.gradle.api.Project; import org.gradle.api.Task; +import org.gradle.api.Transformer; 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; @@ -136,19 +138,7 @@ public class ResolveMainClassName extends DefaultTask { } Provider readMainClassName() { - return this.outputFile.map((file) -> { - if (file.getAsFile().length() == 0) { - throw new InvalidUserDataException( - "Main class name has not been configured and it could not be resolved"); - } - Path output = file.getAsFile().toPath(); - try { - return new String(Files.readAllBytes(output), StandardCharsets.UTF_8); - } - catch (IOException ex) { - throw new RuntimeException("Failed to read main class name from '" + output + "'"); - } - }); + return this.outputFile.map(new ClassNameReader()); } static TaskProvider registerForTask(String taskName, Project project, @@ -189,4 +179,23 @@ public class ResolveMainClassName extends DefaultTask { } } + private static final class ClassNameReader implements Transformer { + + @Override + public String transform(RegularFile file) { + if (file.getAsFile().length() == 0) { + throw new InvalidUserDataException( + "Main class name has not been configured and it could not be resolved"); + } + Path output = file.getAsFile().toPath(); + try { + return new String(Files.readAllBytes(output), StandardCharsets.UTF_8); + } + catch (IOException ex) { + throw new RuntimeException("Failed to read main class name from '" + output + "'"); + } + } + + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java index d2f5b06c39..21fb15d1b3 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java @@ -198,6 +198,8 @@ abstract class AbstractBootArchiveIntegrationTests { Attributes mainAttributes = jarFile.getManifest().getMainAttributes(); assertThat(mainAttributes.getValue("Start-Class")).isEqualTo("com.example.main.CustomMainClass"); } + assertThat(this.gradleBuild.build(this.taskName).task(":" + this.taskName).getOutcome()) + .isEqualTo(TaskOutcome.UP_TO_DATE); } private void copyMainClassApplication() throws IOException {