From 630a5270b4ff7fd0d3367def8147b59e2f5ea92d Mon Sep 17 00:00:00 2001 From: Dinesh Suthar Date: Fri, 13 Feb 2026 23:55:55 +0530 Subject: [PATCH] Add version property links to managed dependency coordinates Signed-off-by: Dinesh Suthar --- .../docs/DocumentManagedDependencies.java | 68 +++++++++++++------ .../dependency-versions/coordinates.adoc | 3 + .../pages/dependency-versions/properties.adoc | 2 + 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/docs/DocumentManagedDependencies.java b/buildSrc/src/main/java/org/springframework/boot/build/docs/DocumentManagedDependencies.java index d405e3e7b6ec..fedfdb178f34 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/docs/DocumentManagedDependencies.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/docs/DocumentManagedDependencies.java @@ -20,8 +20,12 @@ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.Collection; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Collectors; import org.gradle.api.DefaultTask; import org.gradle.api.file.FileCollection; @@ -65,48 +69,72 @@ public void documentConstrainedVersions() throws IOException { outputFile.getParentFile().mkdirs(); try (PrintWriter writer = new PrintWriter(new FileWriter(outputFile))) { writer.println("|==="); - writer.println("| Group ID | Artifact ID | Version"); - Set managedCoordinates = new TreeSet<>((id1, id2) -> { - int result = id1.groupId().compareTo(id2.groupId()); - if (result != 0) { - return result; + writer.println("| Group ID | Artifact ID | Version | Version Property"); + Map> managedCoordinates = new TreeMap<>((id1, id2) -> { + int groupComparison = id1.groupId().compareTo(id2.groupId()); + if (groupComparison != 0) { + return groupComparison; } - return id1.artifactId().compareTo(id2.artifactId()); + int artifactComparison = id1.artifactId().compareTo(id2.artifactId()); + if (artifactComparison != 0) { + return artifactComparison; + } + return id1.version().compareTo(id2.version()); }); for (File file : getResolvedBoms().getFiles()) { - managedCoordinates.addAll(process(ResolvedBom.readFrom(file))); + process(ResolvedBom.readFrom(file), managedCoordinates); } - for (Id id : managedCoordinates) { + for (Map.Entry> entry : managedCoordinates.entrySet()) { + Id id = entry.getKey(); writer.println(); writer.printf("| `%s`%n", id.groupId()); writer.printf("| `%s`%n", id.artifactId()); writer.printf("| `%s`%n", id.version()); + writer.println(formatVersionProperties(entry.getValue())); } writer.println("|==="); } } - private Set process(ResolvedBom resolvedBom) { - TreeSet managedCoordinates = new TreeSet<>(); + private void process(ResolvedBom resolvedBom, Map> managedCoordinates) { for (ResolvedLibrary library : resolvedBom.libraries()) { - for (Id managedDependency : library.managedDependencies()) { - managedCoordinates.add(managedDependency); - } + String versionProperty = library.versionProperty(); + addManagedDependencies(managedCoordinates, versionProperty, library.managedDependencies()); for (Bom importedBom : library.importedBoms()) { - managedCoordinates.addAll(process(importedBom)); + process(importedBom, managedCoordinates, versionProperty); } } - return managedCoordinates; } - private Set process(Bom bom) { - TreeSet managedCoordinates = new TreeSet<>(); - bom.managedDependencies().stream().forEach(managedCoordinates::add); + private void process(Bom bom, Map> managedCoordinates, String versionProperty) { + addManagedDependencies(managedCoordinates, versionProperty, bom.managedDependencies()); + for (Bom importedBom : bom.importedBoms()) { + process(importedBom, managedCoordinates, versionProperty); + } Bom parent = bom.parent(); if (parent != null) { - managedCoordinates.addAll(process(parent)); + process(parent, managedCoordinates, versionProperty); + } + } + + private void addManagedDependencies(Map> managedCoordinates, String versionProperty, + Collection managedDependencies) { + for (Id managedDependency : managedDependencies) { + Set properties = managedCoordinates.computeIfAbsent(managedDependency, (id) -> new TreeSet<>()); + if (versionProperty != null && !versionProperty.isBlank()) { + properties.add(versionProperty); + } + } + } + + private String formatVersionProperties(Set versionProperties) { + if (versionProperties.isEmpty()) { + return "|"; } - return managedCoordinates; + String formattedProperties = versionProperties.stream() + .map((property) -> "`%s`".formatted(property)) + .collect(Collectors.joining(", ")); + return "| " + formattedProperties; } } diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/coordinates.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/coordinates.adoc index 59b1e389e06e..b85c1b7ed1b4 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/coordinates.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/coordinates.adoc @@ -3,5 +3,8 @@ The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a dependency on one of these artifacts without declaring a version, the version listed in the table is used. +The `Version Property` column shows the property or properties that can be used to override each managed version. +If a dependency does not have a dedicated version property, the column is empty. +See xref:appendix:dependency-versions/properties.adoc[Version Properties] for the list of available version properties. include::partial$dependency-versions/documented-coordinates.adoc[] diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/properties.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/properties.adoc index 887b63614f73..1bb680bdbbbe 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/properties.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/appendix/pages/dependency-versions/properties.adoc @@ -2,6 +2,8 @@ = Version Properties The following table provides all properties that can be used to override the versions managed by Spring Boot. +See xref:appendix:dependency-versions/coordinates.adoc[Managed Dependency Coordinates] for the dependencies that each +property can influence. Browse the {code-spring-boot}/platform/spring-boot-dependencies/build.gradle[`spring-boot-dependencies` build.gradle] for a complete list of dependencies. You can learn how to customize these versions in your application in the xref:build-tool-plugin:index.adoc[] documentation.