diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java index a9690523f61..4a0928c0c99 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java @@ -33,7 +33,6 @@ import org.apache.maven.artifact.versioning.VersionRange; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; -import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.artifacts.result.DependencyResult; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; @@ -398,17 +397,10 @@ public class Library { } public Set resolve() { - if (this.managedBy == null) { - throw new IllegalStateException("Version alignment without managedBy is not supported"); - } if (this.alignedVersions != null) { return this.alignedVersions; } - Library managingLibrary = this.libraries.stream() - .filter((candidate) -> this.managedBy.equals(candidate.getName())) - .findFirst() - .orElseThrow(() -> new IllegalStateException("Managing library '" + this.managedBy + "' not found.")); - Map versions = resolveAligningDependencies(managingLibrary); + Map versions = resolveAligningDependencies(); Set versionsInLibrary = new HashSet<>(); for (Group group : this.groups) { for (Module module : group.getModules()) { @@ -428,18 +420,8 @@ public class Library { return this.alignedVersions; } - private Map resolveAligningDependencies(Library manager) { - DependencyHandler dependencyHandler = this.project.getDependencies(); - List boms = manager.getGroups() - .stream() - .flatMap((group) -> group.getBoms() - .stream() - .map((bom) -> dependencyHandler - .platform(group.getId() + ":" + bom + ":" + manager.getVersion().getVersion()))) - .toList(); - List dependencies = new ArrayList<>(); - dependencies.addAll(boms); - dependencies.add(dependencyHandler.create(this.from)); + private Map resolveAligningDependencies() { + List dependencies = getAligningDependencies(); Configuration alignmentConfiguration = this.project.getConfigurations() .detachedConfiguration(dependencies.toArray(new Dependency[0])); Map versions = new HashMap<>(); @@ -452,6 +434,58 @@ public class Library { return versions; } + private List getAligningDependencies() { + if (this.managedBy == null) { + Library fromLibrary = findFromLibrary(); + return List + .of(this.project.getDependencies().create(this.from + ":" + fromLibrary.getVersion().getVersion())); + } + else { + Library managingLibrary = findManagingLibrary(); + List boms = getBomDependencies(managingLibrary); + List dependencies = new ArrayList<>(); + dependencies.addAll(boms); + dependencies.add(this.project.getDependencies().create(this.from)); + return dependencies; + } + } + + private Library findFromLibrary() { + for (Library library : this.libraries) { + for (Group group : library.getGroups()) { + for (Module module : group.getModules()) { + if (this.from.equals(group.getId() + ":" + module.getName())) { + return library; + } + } + } + } + return null; + } + + private Library findManagingLibrary() { + if (this.managedBy == null) { + return null; + } + return this.libraries.stream() + .filter((candidate) -> this.managedBy.equals(candidate.getName())) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Managing library '" + this.managedBy + "' not found.")); + } + + private List getBomDependencies(Library manager) { + if (manager == null) { + return Collections.emptyList(); + } + return manager.getGroups() + .stream() + .flatMap((group) -> group.getBoms() + .stream() + .map((bom) -> this.project.getDependencies() + .platform(group.getId() + ":" + bom + ":" + manager.getVersion().getVersion()))) + .toList(); + } + String getFrom() { return this.from; } @@ -462,7 +496,11 @@ public class Library { @Override public String toString() { - return "version from dependencies of " + this.from + " that is managed by " + this.managedBy; + String result = "version from dependencies of " + this.from; + if (this.managedBy != null) { + result += " that is managed by " + this.managedBy; + } + return result; } } diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 26957320510..c69b70e6f86 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -446,6 +446,11 @@ bom { startsWith(["2018-", "2019-", "2020-", "2021-", "230521-"]) because "These are snapshots that we don't want to see" } + alignWith { + version { + from "org.springframework.graphql:spring-graphql" + } + } group("com.graphql-java") { modules = [ "graphql-java"