Merge branch '3.3.x' into 3.4.x

Closes gh-44881
This commit is contained in:
Andy Wilkinson 2025-03-25 16:28:41 +00:00
commit 42f5f63c8f
5 changed files with 102 additions and 24 deletions

View File

@ -17,7 +17,9 @@
package org.springframework.boot.build.bom;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -40,9 +42,12 @@ import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.ResolvedBom.Bom;
import org.springframework.boot.build.bom.ResolvedBom.Id;
import org.springframework.boot.build.bom.ResolvedBom.JavadocLink;
import org.springframework.boot.build.bom.ResolvedBom.Links;
import org.springframework.boot.build.bom.ResolvedBom.ResolvedLibrary;
/**
@ -85,15 +90,23 @@ class BomResolver {
imports.add(bom);
}
}
List<JavadocLink> javadocLinks = javadocLinksOf(library).stream()
.map((link) -> new JavadocLink(URI.create(link.url(library)), link.packages()))
.toList();
ResolvedLibrary resolvedLibrary = new ResolvedLibrary(library.getName(),
library.getVersion().getVersion().toString(), library.getVersionProperty(), managedDependencies,
imports);
imports, new Links(javadocLinks));
libraries.add(resolvedLibrary);
}
String[] idComponents = bomExtension.getId().split(":");
return new ResolvedBom(new Id(idComponents[0], idComponents[1], idComponents[2]), libraries);
}
private List<Link> javadocLinksOf(Library library) {
List<Link> javadocLinks = library.getLinks("javadoc");
return (javadocLinks != null) ? javadocLinks : Collections.emptyList();
}
Bom resolveMavenBom(String coordinates) {
return bomFrom(resolveBom(coordinates));
}

View File

@ -49,10 +49,10 @@ public abstract class CreateResolvedBom extends DefaultTask {
public abstract RegularFileProperty getOutputFile();
@TaskAction
void describeDependencyManagement() throws IOException {
ResolvedBom dependencyManagement = this.bomResolver.resolve(this.bomExtension);
void createResolvedBom() throws IOException {
ResolvedBom resolvedBom = this.bomResolver.resolve(this.bomExtension);
try (FileWriter writer = new FileWriter(getOutputFile().get().getAsFile())) {
dependencyManagement.writeTo(writer);
resolvedBom.writeTo(writer);
}
}

View File

@ -21,6 +21,7 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.io.Writer;
import java.net.URI;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@ -66,7 +67,7 @@ public record ResolvedBom(Id id, List<ResolvedLibrary> libraries) {
}
public record ResolvedLibrary(String name, String version, String versionProperty, List<Id> managedDependencies,
List<Bom> importedBoms) {
List<Bom> importedBoms, Links links) {
}
@ -109,4 +110,12 @@ public record ResolvedBom(Id id, List<ResolvedLibrary> libraries) {
}
public record Links(List<JavadocLink> javadoc) {
}
public record JavadocLink(URI uri, List<String> packages) {
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.build.docs;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.gradle.api.Action;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.javadoc.Javadoc;
import org.gradle.external.javadoc.StandardJavadocDocletOptions;
import org.springframework.boot.build.bom.ResolvedBom;
import org.springframework.boot.build.bom.ResolvedBom.JavadocLink;
/**
* An {@link Action} to configure the links option of a {@link Javadoc} task.
*
* @author Andy Wilkinson
*/
public class ConfigureJavadocLinks implements Action<Javadoc> {
private final FileCollection resolvedBoms;
private final Collection<String> includedLibraries;
public ConfigureJavadocLinks(FileCollection resolvedBoms, Collection<String> includedLibraries) {
this.resolvedBoms = resolvedBoms;
this.includedLibraries = includedLibraries;
}
@Override
public void execute(Javadoc javadoc) {
javadoc.options((options) -> {
if (options instanceof StandardJavadocDocletOptions standardOptions) {
configureLinks(standardOptions);
}
});
}
private void configureLinks(StandardJavadocDocletOptions options) {
ResolvedBom resolvedBom = ResolvedBom.readFrom(this.resolvedBoms.getSingleFile());
List<String> links = new ArrayList<>();
links.add("https://docs.oracle.com/en/java/javase/17/docs/api/");
links.add("https://jakarta.ee/specifications/platform/9/apidocs/");
resolvedBom.libraries()
.stream()
.filter((candidate) -> this.includedLibraries.contains(candidate.name()))
.flatMap((library) -> library.links().javadoc().stream())
.map(JavadocLink::uri)
.map(URI::toString)
.forEach(links::add);
options.setLinks(links);
}
}

View File

@ -1,3 +1,5 @@
import org.springframework.boot.build.docs.ConfigureJavadocLinks
plugins {
id "dev.adamko.dokkatoo-html"
id "java"
@ -201,7 +203,6 @@ dokkatoo {
}
task aggregatedJavadoc(type: Javadoc) {
dependsOn dependencyVersions
project.rootProject.gradle.projectsEvaluated {
Set<Project> publishedProjects = rootProject.subprojects.findAll { it != project }
.findAll { it.plugins.hasPlugin(JavaPlugin) && it.plugins.hasPlugin(MavenPublishPlugin) }
@ -223,24 +224,7 @@ task aggregatedJavadoc(type: Javadoc) {
use = true
windowTitle = "Spring Boot ${project.version} API"
}
doFirst {
def versionConstraints = dependencyVersions.versionConstraints
def toMajorMinorVersion = version -> {
String formatted = version.split("\\.").take(2).join('.') + '.x'
return version.endsWith("-SNAPSHOT") ? formatted + "-SNAPSHOT" : formatted
}
def springFrameworkVersion = toMajorMinorVersion(versionConstraints["org.springframework:spring-core"])
def springSecurityVersion = toMajorMinorVersion(versionConstraints["org.springframework.security:spring-security-core"])
def tomcatVersion = "${versionConstraints["org.apache.tomcat:tomcat-annotations-api"]}"
def tomcatDocsVersion = tomcatVersion.substring(0, tomcatVersion.lastIndexOf("."));
options.links = [
"https://docs.oracle.com/en/java/javase/17/docs/api/",
"https://docs.spring.io/spring-framework/docs/${springFrameworkVersion}/javadoc-api/",
"https://docs.spring.io/spring-security/site/docs/${springSecurityVersion}/api/",
"https://jakarta.ee/specifications/platform/9/apidocs/",
"https://tomcat.apache.org/tomcat-${tomcatDocsVersion}-doc/api/",
] as String[]
}
doFirst(new ConfigureJavadocLinks(configurations.resolvedBom, ["Spring Framework", "Spring Security", "Tomcat"]))
}
}