diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java index fb3f6e96221..20e52fd3305 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java @@ -31,6 +31,8 @@ import org.apache.maven.artifact.versioning.Restriction; import org.apache.maven.artifact.versioning.VersionRange; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.tasks.TaskAction; import org.springframework.boot.build.bom.Library.Group; @@ -47,11 +49,17 @@ import org.springframework.boot.build.bom.bomr.version.DependencyVersion; */ public abstract class CheckBom extends DefaultTask { + private final ConfigurationContainer configurations; + + private final DependencyHandler dependencies; + private final BomExtension bom; @Inject public CheckBom(BomExtension bom) { this.bom = bom; + this.configurations = getProject().getConfigurations(); + this.dependencies = getProject().getDependencies(); } @TaskAction @@ -93,9 +101,8 @@ public abstract class CheckBom extends DefaultTask { } private void checkExclusions(String groupId, Module module, DependencyVersion version, List errors) { - Set resolved = getProject().getConfigurations() - .detachedConfiguration( - getProject().getDependencies().create(groupId + ":" + module.getName() + ":" + version)) + Set resolved = this.configurations + .detachedConfiguration(this.dependencies.create(groupId + ":" + module.getName() + ":" + version)) .getResolvedConfiguration() .getResolvedArtifacts() .stream() @@ -202,8 +209,7 @@ public abstract class CheckBom extends DefaultTask { private File resolveBom(Library library, String alignsWithBom) { String coordinates = alignsWithBom + ":" + library.getVersion().getVersion() + "@pom"; - Set files = getProject().getConfigurations() - .detachedConfiguration(getProject().getDependencies().create(coordinates)) + Set files = this.configurations.detachedConfiguration(this.dependencies.create(coordinates)) .getResolvedConfiguration() .getFiles(); if (files.size() != 1) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java index 6fee7146189..7bd03366c6d 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java @@ -35,6 +35,7 @@ import org.springframework.boot.build.bom.bomr.ReleaseSchedule.Release; import org.springframework.boot.build.bom.bomr.github.Milestone; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.boot.build.properties.BuildProperties; +import org.springframework.boot.build.properties.BuildType; /** * A {@link Task} to move to snapshot dependencies. @@ -45,6 +46,8 @@ public abstract class MoveToSnapshots extends UpgradeDependencies { private static final Logger logger = LoggerFactory.getLogger(MoveToSnapshots.class); + private final BuildType buildType = BuildProperties.get(getProject()).buildType(); + @Inject public MoveToSnapshots(BomExtension bom) { super(bom, true); @@ -87,7 +90,7 @@ public abstract class MoveToSnapshots extends UpgradeDependencies { @Override protected List> determineUpdatePredicates(Milestone milestone) { - return switch (BuildProperties.get(getProject()).buildType()) { + return switch (this.buildType) { case OPEN_SOURCE -> determineOpenSourceUpdatePredicates(milestone); case COMMERCIAL -> super.determineUpdatePredicates(milestone); }; diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java index fced373524f..80052ef1209 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java @@ -20,6 +20,7 @@ import javax.inject.Inject; import org.gradle.api.Task; import org.gradle.api.artifacts.ArtifactRepositoryContainer; +import org.gradle.api.artifacts.dsl.RepositoryHandler; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.springframework.boot.build.bom.BomExtension; @@ -37,14 +38,14 @@ public abstract class UpgradeBom extends UpgradeDependencies { public UpgradeBom(BomExtension bom) { super(bom); switch (BuildProperties.get(getProject()).buildType()) { - case OPEN_SOURCE -> addOpenSourceRepositories(); + case OPEN_SOURCE -> addOpenSourceRepositories(getProject().getRepositories()); case COMMERCIAL -> addCommercialRepositories(); } } - private void addOpenSourceRepositories() { + private void addOpenSourceRepositories(RepositoryHandler repositories) { getRepositoryNames().add(ArtifactRepositoryContainer.DEFAULT_MAVEN_CENTRAL_REPO_NAME); - getProject().getRepositories().withType(MavenArtifactRepository.class, (repository) -> { + repositories.withType(MavenArtifactRepository.class, (repository) -> { String name = repository.getName(); if (name.startsWith("spring-") && !name.endsWith("-snapshot")) { getRepositoryNames().add(name); diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java index 4a4635e2ddf..1b7cb3f8e6b 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java @@ -35,6 +35,7 @@ import javax.inject.Inject; import org.gradle.api.DefaultTask; import org.gradle.api.InvalidUserDataException; +import org.gradle.api.artifacts.dsl.RepositoryHandler; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.internal.tasks.userinput.UserInputHandler; import org.gradle.api.provider.ListProperty; @@ -66,6 +67,10 @@ public abstract class UpgradeDependencies extends DefaultTask { private final boolean movingToSnapshots; + private final UpgradeApplicator upgradeApplicator; + + private final RepositoryHandler repositories; + @Inject public UpgradeDependencies(BomExtension bom) { this(bom, false); @@ -75,6 +80,9 @@ public abstract class UpgradeDependencies extends DefaultTask { this.bom = bom; getThreads().convention(2); this.movingToSnapshots = movingToSnapshots; + this.upgradeApplicator = new UpgradeApplicator(getProject().getBuildFile().toPath(), + new File(getProject().getRootProject().getProjectDir(), "gradle.properties").toPath()); + this.repositories = getProject().getRepositories(); } @Input @@ -106,9 +114,6 @@ public abstract class UpgradeDependencies extends DefaultTask { private void applyUpgrades(GitHubRepository repository, List issueLabels, Milestone milestone, List upgrades) { - Path buildFile = getProject().getBuildFile().toPath(); - Path gradleProperties = new File(getProject().getRootProject().getProjectDir(), "gradle.properties").toPath(); - UpgradeApplicator upgradeApplicator = new UpgradeApplicator(buildFile, gradleProperties); List existingUpgradeIssues = repository.findIssues(issueLabels, milestone); System.out.println("Applying upgrades..."); System.out.println(""); @@ -117,7 +122,7 @@ public abstract class UpgradeDependencies extends DefaultTask { String title = issueTitle(upgrade); Issue existingUpgradeIssue = findExistingUpgradeIssue(existingUpgradeIssues, upgrade); try { - Path modified = upgradeApplicator.apply(upgrade); + Path modified = this.upgradeApplicator.apply(upgrade); int issueNumber = getOrOpenUpgradeIssue(repository, issueLabels, milestone, title, existingUpgradeIssue); if (existingUpgradeIssue != null && existingUpgradeIssue.getState() == Issue.State.CLOSED) { @@ -236,7 +241,7 @@ public abstract class UpgradeDependencies extends DefaultTask { private List asRepositories(List repositoryNames) { return repositoryNames.stream() - .map(getProject().getRepositories()::getByName) + .map(this.repositories::getByName) .map(MavenArtifactRepository.class::cast) .toList(); } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForUnnecessaryExclusions.java b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForUnnecessaryExclusions.java index 16dadff5d2d..3f2e0975a19 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForUnnecessaryExclusions.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForUnnecessaryExclusions.java @@ -59,7 +59,7 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask private final Dependency platform; - private final DependencyHandler dependencyHandler; + private final DependencyHandler dependencies; private final ConfigurationContainer configurations; @@ -68,10 +68,10 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask @Inject public CheckClasspathForUnnecessaryExclusions(DependencyHandler dependencyHandler, ConfigurationContainer configurations) { - this.dependencyHandler = getProject().getDependencies(); + this.dependencies = getProject().getDependencies(); this.configurations = getProject().getConfigurations(); - this.platform = this.dependencyHandler - .create(this.dependencyHandler.platform(this.dependencyHandler.project(SPRING_BOOT_DEPENDENCIES_PROJECT))); + this.platform = this.dependencies + .create(this.dependencies.platform(this.dependencies.project(SPRING_BOOT_DEPENDENCIES_PROJECT))); getOutputs().upToDateWhen((task) -> true); } @@ -101,7 +101,7 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask .collect(Collectors.toCollection(TreeSet::new)); this.exclusionsByDependencyId.put(dependencyId, exclusions); if (!exclusions.isEmpty()) { - this.dependencyById.put(dependencyId, getProject().getDependencies().create(dependencyId)); + this.dependencyById.put(dependencyId, this.dependencies.create(dependencyId)); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java b/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java index 3edf6097d3c..67e5491c6ce 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java @@ -54,6 +54,8 @@ public abstract class HomebrewFormula extends DefaultTask { private final FileSystemOperations fileSystemOperations; + private final BuildType buildType; + @Inject public HomebrewFormula(FileSystemOperations fileSystemOperations) { this.fileSystemOperations = fileSystemOperations; @@ -62,6 +64,7 @@ public abstract class HomebrewFormula extends DefaultTask { properties.put("hash", getArchive().map((archive) -> sha256(archive.getAsFile()))); getProperties().put("repo", ArtifactRelease.forProject(project).getDownloadRepo()); getProperties().put("version", project.getVersion().toString()); + this.buildType = BuildProperties.get(getProject()).buildType(); } private String sha256(File file) { @@ -90,8 +93,7 @@ public abstract class HomebrewFormula extends DefaultTask { @TaskAction void createFormula() { - BuildType buildType = BuildProperties.get(getProject()).buildType(); - if (buildType != BuildType.OPEN_SOURCE) { + if (this.buildType != BuildType.OPEN_SOURCE) { logger.debug("Skipping Homebrew formula for non open source build type"); return; } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java b/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java index bd6a57d11d5..e1147c672d3 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java @@ -62,17 +62,18 @@ public abstract class ExtractVersionConstraints extends DefaultTask { private final List boms = new ArrayList<>(); + private final DependencyHandler dependencies; + public ExtractVersionConstraints() { - DependencyHandler dependencies = getProject().getDependencies(); + this.dependencies = getProject().getDependencies(); this.configuration = getProject().getConfigurations().create(getName()); - dependencies.getComponents().all(this::processMetadataDetails); + this.dependencies.getComponents().all(this::processMetadataDetails); } public void enforcedPlatform(String projectPath) { this.configuration.getDependencies() - .add(getProject().getDependencies() - .enforcedPlatform( - getProject().getDependencies().project(Collections.singletonMap("path", projectPath)))); + .add(this.dependencies + .enforcedPlatform(this.dependencies.project(Collections.singletonMap("path", projectPath)))); Project project = getProject().project(projectPath); project.getPlugins().withType(BomPlugin.class).all((plugin) -> { this.boms.add(project.getExtensions().getByType(BomExtension.class)); diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java index 485f731cc4a..280979a384f 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.Properties; import java.util.function.BiConsumer; +import javax.inject.Inject; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -334,6 +335,13 @@ public class MavenPluginPlugin implements Plugin { public abstract static class FormatHelpMojoSource extends DefaultTask { + private final ObjectFactory objectFactory; + + @Inject + public FormatHelpMojoSource(ObjectFactory objectFactory) { + this.objectFactory = objectFactory; + } + private Task generator; void setGenerator(Task generator) { @@ -350,7 +358,7 @@ public class MavenPluginPlugin implements Plugin { void syncAndFormat() { FileFormatter formatter = new FileFormatter(); for (File output : this.generator.getOutputs().getFiles()) { - formatter.formatFiles(getProject().fileTree(output), StandardCharsets.UTF_8) + formatter.formatFiles(this.objectFactory.fileTree().from(output), StandardCharsets.UTF_8) .forEach((edit) -> save(output, edit)); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java index 5ab7b4b4829..017f87322ba 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java @@ -16,14 +16,21 @@ package org.springframework.boot.build.mavenplugin; +import java.util.Set; +import java.util.stream.Collectors; + import javax.inject.Inject; import org.gradle.api.DefaultTask; import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.file.ArchiveOperations; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileSystemOperations; +import org.gradle.api.file.FileTree; +import org.gradle.api.provider.Provider; import org.gradle.api.provider.SetProperty; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.OutputDirectory; @@ -38,12 +45,19 @@ public abstract class PrepareMavenBinaries extends DefaultTask { private final FileSystemOperations fileSystemOperations; - private final ArchiveOperations archiveOperations; + private final Provider> binaries; @Inject public PrepareMavenBinaries(FileSystemOperations fileSystemOperations, ArchiveOperations archiveOperations) { this.fileSystemOperations = fileSystemOperations; - this.archiveOperations = archiveOperations; + ConfigurationContainer configurations = getProject().getConfigurations(); + DependencyHandler dependencies = getProject().getDependencies(); + this.binaries = getVersions().map((versions) -> versions.stream() + .map((version) -> configurations + .detachedConfiguration(dependencies.create("org.apache.maven:apache-maven:" + version + ":bin@zip"))) + .map(Configuration::getSingleFile) + .map(archiveOperations::zipTree) + .collect(Collectors.toSet())); } @OutputDirectory @@ -56,14 +70,8 @@ public abstract class PrepareMavenBinaries extends DefaultTask { public void prepareBinaries() { this.fileSystemOperations.sync((sync) -> { sync.into(getOutputDir()); - for (String version : getVersions().get()) { - Configuration configuration = getProject().getConfigurations() - .detachedConfiguration(getProject().getDependencies() - .create("org.apache.maven:apache-maven:" + version + ":bin@zip")); - sync.from(this.archiveOperations.zipTree(configuration.getSingleFile())); - } + this.binaries.get().forEach(sync::from); }); - } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java index 60ba288ec4c..f8fec31b50e 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java @@ -36,11 +36,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import javax.inject.Inject; + import org.gradle.api.DefaultTask; import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.InputFiles; @@ -65,13 +68,17 @@ import org.springframework.util.StringUtils; */ public abstract class TestSliceMetadata extends DefaultTask { + private final ObjectFactory objectFactory; + private FileCollection classpath; private FileCollection importsFiles; private FileCollection classesDirs; - public TestSliceMetadata() { + @Inject + public TestSliceMetadata(ObjectFactory objectFactory) { + this.objectFactory = objectFactory; Configuration testSliceMetadata = getProject().getConfigurations().maybeCreate("testSliceMetadata"); getProject().afterEvaluate((evaluated) -> evaluated.getArtifacts() .add(testSliceMetadata.getName(), getOutputFile(), (artifact) -> artifact.builtBy(this))); @@ -79,8 +86,9 @@ public abstract class TestSliceMetadata extends DefaultTask { public void setSourceSet(SourceSet sourceSet) { this.classpath = sourceSet.getRuntimeClasspath(); - this.importsFiles = getProject().fileTree(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring"), - (tree) -> tree.filter((file) -> file.getName().endsWith(".imports"))); + this.importsFiles = this.objectFactory.fileTree() + .from(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring")); + this.importsFiles.filter((file) -> file.getName().endsWith(".imports")); getSpringFactories().set(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories")); this.classesDirs = sourceSet.getOutput().getClassesDirs(); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle index 61dde9509f6..644cfda1c4f 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle @@ -32,10 +32,11 @@ task syncIntegrationTestSources(type: Sync) { } processResources { + def version = project.version eachFile { - filter { it.replace('${spring-boot.version}', project.version) } + filter { it.replace('${spring-boot.version}', version) } } - inputs.property "version", project.version + inputs.property "version", version } task integrationTest {