Use sorted properties to ensure output is repeatable

Closes gh-21593
This commit is contained in:
Andy Wilkinson 2020-05-27 20:14:36 +01:00
parent 343e4d4318
commit b50b00d629
3 changed files with 8 additions and 3 deletions

View File

@ -30,6 +30,8 @@ import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import org.springframework.core.CollectionFactory;
/** /**
* A {@link Task} for generating metadata describing a project's auto-configuration * A {@link Task} for generating metadata describing a project's auto-configuration
* classes. * classes.
@ -73,7 +75,7 @@ public class AutoConfigurationMetadata extends AbstractTask {
} }
private Properties readAutoConfiguration() throws IOException { private Properties readAutoConfiguration() throws IOException {
Properties autoConfiguration = new Properties(); Properties autoConfiguration = CollectionFactory.createSortedProperties(true);
Properties springFactories = readSpringFactories( Properties springFactories = readSpringFactories(
new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories")); new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories"));
autoConfiguration.setProperty("autoConfigurationClassNames", autoConfiguration.setProperty("autoConfigurationClassNames",

View File

@ -32,6 +32,8 @@ import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import org.springframework.core.CollectionFactory;
/** /**
* A {@link Task} for generating metadata that describes a starter. * A {@link Task} for generating metadata that describes a starter.
* *
@ -68,7 +70,7 @@ public class StarterMetadata extends AbstractTask {
@TaskAction @TaskAction
void generateMetadata() throws IOException { void generateMetadata() throws IOException {
Properties properties = new Properties(); Properties properties = CollectionFactory.createSortedProperties(true);
properties.setProperty("name", getProject().getName()); properties.setProperty("name", getProject().getName());
properties.setProperty("description", getProject().getDescription()); properties.setProperty("description", getProject().getDescription());
properties.setProperty("dependencies", String.join(",", this.dependencies.getResolvedConfiguration() properties.setProperty("dependencies", String.join(",", this.dependencies.getResolvedConfiguration()

View File

@ -42,6 +42,7 @@ import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import org.springframework.core.CollectionFactory;
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResource;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReader;
@ -91,7 +92,7 @@ public class TestSliceMetadata extends AbstractTask {
} }
private Properties readTestSlices() throws IOException { private Properties readTestSlices() throws IOException {
Properties testSlices = new Properties(); Properties testSlices = CollectionFactory.createSortedProperties(true);
try (URLClassLoader classLoader = new URLClassLoader( try (URLClassLoader classLoader = new URLClassLoader(
StreamSupport.stream(this.sourceSet.getRuntimeClasspath().spliterator(), false).map(this::toURL) StreamSupport.stream(this.sourceSet.getRuntimeClasspath().spliterator(), false).map(this::toURL)
.toArray(URL[]::new))) { .toArray(URL[]::new))) {