mirror of
https://github.com/spring-projects/spring-boot.git
synced 2026-09-17 12:09:16 +00:00
Merge branch '4.1.x'
This commit is contained in:
@@ -174,7 +174,7 @@ public class AntoraConventions {
|
||||
antoraTask.dependsOn(npmInstallTask, generateAntoraPlaybookTask);
|
||||
antoraTask.setPlaybook("antora-playbook.yml");
|
||||
antoraTask.setUiBundleUrl(getUiBundleUrl(project));
|
||||
antoraTask.getArgs().set(project.provider(() -> getAntoraNpxArs(project, antoraTask)));
|
||||
antoraTask.getArgs().set(project.provider(() -> getAntoraNpxArgs(project, antoraTask)));
|
||||
project.getPlugins()
|
||||
.withType(JavaBasePlugin.class,
|
||||
(javaBasePlugin) -> project.getTasks()
|
||||
@@ -182,7 +182,7 @@ public class AntoraConventions {
|
||||
.dependsOn(antoraTask));
|
||||
}
|
||||
|
||||
private List<String> getAntoraNpxArs(Project project, AntoraTask antoraTask) {
|
||||
private List<String> getAntoraNpxArgs(Project project, AntoraTask antoraTask) {
|
||||
logWarningIfNodeModulesInUserHome(project);
|
||||
StartParameter startParameter = project.getGradle().getStartParameter();
|
||||
boolean showStacktrace = startParameter.getShowStacktrace().name().startsWith("ALWAYS");
|
||||
|
||||
+53
-68
@@ -20,13 +20,11 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.TreeMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.gradle.api.Project;
|
||||
@@ -34,8 +32,10 @@ import org.gradle.api.Project;
|
||||
import org.springframework.boot.build.artifacts.ArtifactRelease;
|
||||
import org.springframework.boot.build.bom.BomExtension;
|
||||
import org.springframework.boot.build.bom.Library;
|
||||
import org.springframework.boot.build.bom.Library.Link;
|
||||
import org.springframework.boot.build.bom.Library.LinkType;
|
||||
import org.springframework.boot.build.bom.Library.LinkedVersion;
|
||||
import org.springframework.boot.build.bom.ResolvedBom;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.Bom;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.Id;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.ResolvedLibrary;
|
||||
import org.springframework.boot.build.properties.BuildProperties;
|
||||
@@ -61,6 +61,8 @@ public class AntoraAsciidocAttributes {
|
||||
|
||||
private final List<Library> libraries;
|
||||
|
||||
private final ResolvedBom resolvedBom;
|
||||
|
||||
private final Map<String, String> dependencyVersions;
|
||||
|
||||
private final Map<String, ?> projectProperties;
|
||||
@@ -71,53 +73,11 @@ public class AntoraAsciidocAttributes {
|
||||
this.buildType = BuildProperties.get(project).buildType();
|
||||
this.artifactRelease = ArtifactRelease.forProject(project);
|
||||
this.libraries = dependencyBom.getLibraries();
|
||||
this.dependencyVersions = dependencyVersionsOf(resolvedBom);
|
||||
this.resolvedBom = resolvedBom;
|
||||
this.dependencyVersions = resolvedBom.dependencyVersions();
|
||||
this.projectProperties = project.getProperties();
|
||||
}
|
||||
|
||||
private static Map<String, String> dependencyVersionsOf(ResolvedBom resolvedBom) {
|
||||
Map<String, String> dependencyVersions = new HashMap<>();
|
||||
for (ResolvedLibrary library : resolvedBom.libraries()) {
|
||||
dependencyVersions.putAll(dependencyVersionsOf(library.managedDependencies()));
|
||||
for (Bom importedBom : library.importedBoms()) {
|
||||
dependencyVersions.putAll(dependencyVersionsOf(importedBom));
|
||||
}
|
||||
}
|
||||
return dependencyVersions;
|
||||
}
|
||||
|
||||
private static Map<String, String> dependencyVersionsOf(Bom bom) {
|
||||
Map<String, String> dependencyVersions = new HashMap<>();
|
||||
if (bom != null) {
|
||||
dependencyVersions.putAll(dependencyVersionsOf(bom.managedDependencies()));
|
||||
dependencyVersions.putAll(dependencyVersionsOf(bom.parent()));
|
||||
for (Bom importedBom : bom.importedBoms()) {
|
||||
dependencyVersions.putAll(dependencyVersionsOf(importedBom));
|
||||
}
|
||||
}
|
||||
return dependencyVersions;
|
||||
}
|
||||
|
||||
private static Map<String, String> dependencyVersionsOf(Collection<Id> managedDependencies) {
|
||||
Map<String, String> dependencyVersions = new HashMap<>();
|
||||
for (Id managedDependency : managedDependencies) {
|
||||
dependencyVersions.put(managedDependency.groupId() + ":" + managedDependency.artifactId(),
|
||||
managedDependency.version());
|
||||
}
|
||||
return dependencyVersions;
|
||||
}
|
||||
|
||||
AntoraAsciidocAttributes(String version, boolean latestVersion, BuildType buildType, List<Library> libraries,
|
||||
Map<String, String> dependencyVersions, Map<String, ?> projectProperties) {
|
||||
this.version = version;
|
||||
this.latestVersion = latestVersion;
|
||||
this.buildType = buildType;
|
||||
this.artifactRelease = ArtifactRelease.forVersion(version);
|
||||
this.libraries = (libraries != null) ? libraries : Collections.emptyList();
|
||||
this.dependencyVersions = (dependencyVersions != null) ? dependencyVersions : Collections.emptyMap();
|
||||
this.projectProperties = (projectProperties != null) ? projectProperties : Collections.emptyMap();
|
||||
}
|
||||
|
||||
public Map<String, String> get() {
|
||||
Map<String, String> attributes = new LinkedHashMap<>();
|
||||
Map<String, String> internal = new LinkedHashMap<>();
|
||||
@@ -126,7 +86,7 @@ public class AntoraAsciidocAttributes {
|
||||
addVersionAttributes(attributes, internal);
|
||||
addArtifactAttributes(attributes);
|
||||
addUrlJava(attributes);
|
||||
addUrlLibraryLinkAttributes(attributes);
|
||||
addLinksAttributes(attributes);
|
||||
addPropertyAttributes(attributes, internal);
|
||||
return attributes;
|
||||
}
|
||||
@@ -229,25 +189,10 @@ public class AntoraAsciidocAttributes {
|
||||
attributes.put("javadoc-location-javax-xml", "{url-javase-javadoc}/java.xml");
|
||||
}
|
||||
|
||||
private void addUrlLibraryLinkAttributes(Map<String, String> attributes) {
|
||||
Map<String, String> packageAttributes = new LinkedHashMap<>();
|
||||
this.libraries.forEach((library) -> {
|
||||
library.getLinks().forEachLink((type, link) -> {
|
||||
String linkRootName = (link.rootName() != null) ? link.rootName() : library.getLinkRootName();
|
||||
String linkName = "url-" + linkRootName + "-" + type.attributeName();
|
||||
attributes.put(linkName, link.url(library.getVersion()));
|
||||
link.packages()
|
||||
.stream()
|
||||
.map(this::packageAttributeName)
|
||||
.forEach((packageAttributeName) -> packageAttributes.put(packageAttributeName,
|
||||
"{" + linkName + "}"));
|
||||
});
|
||||
});
|
||||
attributes.putAll(packageAttributes);
|
||||
}
|
||||
|
||||
private String packageAttributeName(String packageName) {
|
||||
return "javadoc-location-" + packageName.replace('.', '-');
|
||||
private void addLinksAttributes(Map<String, String> attributes) {
|
||||
LinkAttributes linkAttributes = new LinkAttributes();
|
||||
this.libraries.forEach(linkAttributes::add);
|
||||
linkAttributes.copyTo(attributes);
|
||||
}
|
||||
|
||||
private void addPropertyAttributes(Map<String, String> attributes, Map<String, String> internal) {
|
||||
@@ -275,4 +220,44 @@ public class AntoraAsciidocAttributes {
|
||||
return value;
|
||||
}
|
||||
|
||||
class LinkAttributes {
|
||||
|
||||
private final Map<String, String> urlAttributes = new TreeMap<>();
|
||||
|
||||
private final Map<String, String> packageAttributes = new TreeMap<>();
|
||||
|
||||
void add(Library library) {
|
||||
ResolvedLibrary resolvedLibrary = AntoraAsciidocAttributes.this.resolvedBom.library(library);
|
||||
LinkedVersion libraryVersion = new LinkedVersion(library.getVersion());
|
||||
String libraryName = library.getLinkRootName();
|
||||
library.getLinks().forEachLink((type, link) -> addLinkAttributes(libraryName, type, link, libraryVersion));
|
||||
library.getModuleLinks().forEach((moduleName, links) -> {
|
||||
Id resolvedModule = resolvedLibrary.module(moduleName);
|
||||
LinkedVersion moduleVersion = new LinkedVersion(resolvedModule.version());
|
||||
links.forEachLink((type, link) -> addLinkAttributes(moduleName, type, link, moduleVersion));
|
||||
});
|
||||
}
|
||||
|
||||
private void addLinkAttributes(String root, LinkType type, Link link, LinkedVersion version) {
|
||||
String urlAttributeName = "url-" + root + "-" + type.attributeName();
|
||||
this.urlAttributes.put(urlAttributeName, link.url(version));
|
||||
link.packages()
|
||||
.stream()
|
||||
.map(this::packageAttributeName)
|
||||
.forEach((packageAttributeName) -> this.packageAttributes.put(packageAttributeName,
|
||||
"{" + urlAttributeName + "}"));
|
||||
}
|
||||
|
||||
private String packageAttributeName(String packageName) {
|
||||
return "javadoc-location-" + packageName.replace('.', '-');
|
||||
}
|
||||
|
||||
void copyTo(Map<String, String> attributes) {
|
||||
// URL attributes first since package attributes reference them
|
||||
attributes.putAll(this.urlAttributes);
|
||||
attributes.putAll(this.packageAttributes);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public class BomExtension {
|
||||
addLibrary(new Library(name, libraryHandler.calendarName, libraryVersion, libraryHandler.groups,
|
||||
libraryHandler.upgradePolicy, libraryHandler.prohibitedVersions, firstParty,
|
||||
versionAlignment(libraryHandler), libraryHandler.alignWith.bomAlignment, libraryHandler.linkRootName,
|
||||
new Links(libraryHandler.links)));
|
||||
libraryHandler.links, libraryHandler.moduleLinks));
|
||||
}
|
||||
|
||||
private VersionAlignment versionAlignment(LibraryHandler libraryHandler) {
|
||||
@@ -231,7 +231,9 @@ public class BomExtension {
|
||||
|
||||
private String linkRootName;
|
||||
|
||||
private final Map<LinkType, List<Link>> links = new HashMap<>();
|
||||
private Links links;
|
||||
|
||||
private Map<String, Links> moduleLinks;
|
||||
|
||||
@Inject
|
||||
public LibraryHandler(Project project, String version) {
|
||||
@@ -281,15 +283,17 @@ public class BomExtension {
|
||||
action.execute(this.alignWith);
|
||||
}
|
||||
|
||||
public void links(Action<LinksHandler> action) {
|
||||
public void links(Action<LibraryLinksHandler> action) {
|
||||
links(null, action);
|
||||
}
|
||||
|
||||
public void links(String linkRootName, Action<LinksHandler> action) {
|
||||
LinksHandler handler = new LinksHandler();
|
||||
public void links(String linkRootName, Action<LibraryLinksHandler> action) {
|
||||
LibraryLinksHandler handler = new LibraryLinksHandler();
|
||||
action.execute(handler);
|
||||
this.linkRootName = linkRootName;
|
||||
this.links.putAll(handler.links);
|
||||
this.links = new Links(handler.links());
|
||||
this.moduleLinks = new HashMap<>();
|
||||
handler.moduleLinks().forEach((module, links) -> this.moduleLinks.put(module, new Links(links)));
|
||||
}
|
||||
|
||||
public static class ProhibitedHandler {
|
||||
@@ -523,10 +527,14 @@ public class BomExtension {
|
||||
|
||||
}
|
||||
|
||||
public static class LinksHandler {
|
||||
public abstract static class LinksHandler {
|
||||
|
||||
private final Map<LinkType, List<Link>> links = new HashMap<>();
|
||||
|
||||
Map<LinkType, List<Link>> links() {
|
||||
return this.links;
|
||||
}
|
||||
|
||||
public void site(String linkTemplate) {
|
||||
site(asFactory(linkTemplate));
|
||||
}
|
||||
@@ -567,10 +575,6 @@ public class BomExtension {
|
||||
add(LinkType.JAVADOC, linkFactory, packages);
|
||||
}
|
||||
|
||||
public void javadoc(String rootName, Function<LinkedVersion, String> linkFactory, String... packages) {
|
||||
add(rootName, LinkType.JAVADOC, linkFactory, packages);
|
||||
}
|
||||
|
||||
public void releaseNotes(String linkTemplate) {
|
||||
releaseNotes(asFactory(linkTemplate));
|
||||
}
|
||||
@@ -592,12 +596,7 @@ public class BomExtension {
|
||||
}
|
||||
|
||||
private void add(LinkType type, Function<LinkedVersion, String> linkFactory, String[] packages) {
|
||||
add(null, type, linkFactory, packages);
|
||||
}
|
||||
|
||||
private void add(String rootName, LinkType type, Function<LinkedVersion, String> linkFactory,
|
||||
String[] packages) {
|
||||
Link link = new Link(rootName, linkFactory, (packages != null) ? List.of(packages) : null);
|
||||
Link link = new Link(linkFactory, (packages != null) ? List.of(packages) : null);
|
||||
this.links.computeIfAbsent(type, (key) -> new ArrayList<>()).add(link);
|
||||
}
|
||||
|
||||
@@ -610,6 +609,34 @@ public class BomExtension {
|
||||
|
||||
}
|
||||
|
||||
public static class LibraryLinksHandler extends LinksHandler {
|
||||
|
||||
private final Map<String, Map<LinkType, List<Link>>> moduleLinks = new HashMap<>();
|
||||
|
||||
public Map<String, Map<LinkType, List<Link>>> moduleLinks() {
|
||||
return this.moduleLinks;
|
||||
}
|
||||
|
||||
public void module(String moduleName, Closure<ModuleLinksHandler> closure) {
|
||||
ModuleLinksHandler handler = new ModuleLinksHandler();
|
||||
closure.setDelegate(handler);
|
||||
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
|
||||
closure.call(handler);
|
||||
this.moduleLinks.computeIfAbsent(moduleName, (key) -> new HashMap<>()).putAll(handler.links());
|
||||
}
|
||||
|
||||
public void module(String moduleName, Action<ModuleLinksHandler> action) {
|
||||
ModuleLinksHandler handler = new ModuleLinksHandler();
|
||||
action.execute(handler);
|
||||
this.moduleLinks.computeIfAbsent(moduleName, (key) -> new HashMap<>()).putAll(handler.links());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class ModuleLinksHandler extends LinksHandler {
|
||||
|
||||
}
|
||||
|
||||
public static class UpgradeHandler {
|
||||
|
||||
private UpgradePolicy upgradePolicy;
|
||||
|
||||
@@ -65,13 +65,15 @@ public class BomPlugin implements Plugin<Project> {
|
||||
TaskProvider<CheckBom> checkBom = project.getTasks().register("bomrCheck", CheckBom.class, bom);
|
||||
checkBom.configure(
|
||||
(task) -> task.getResolvedBomFile().set(createResolvedBom.flatMap(CreateResolvedBom::getOutputFile)));
|
||||
Configuration resolvedBom = project.getConfigurations().create("resolvedBom");
|
||||
project.getTasks().named("check").configure((check) -> check.dependsOn(checkBom));
|
||||
project.getTasks().register("bomrUpgrade", UpgradeBom.class, bom);
|
||||
project.getTasks().register("moveToSnapshots", MoveToSnapshots.class, bom);
|
||||
project.getTasks().register("checkLinks", CheckLinks.class, bom);
|
||||
Configuration resolvedBomConfiguration = project.getConfigurations().create("resolvedBom");
|
||||
project.getTasks()
|
||||
.register("checkLinks", CheckLinks.class, bom, resolvedBom)
|
||||
.configure((task) -> task.dependsOn(resolvedBom));
|
||||
project.getArtifacts()
|
||||
.add(resolvedBomConfiguration.getName(), createResolvedBom.map(CreateResolvedBom::getOutputFile),
|
||||
.add(resolvedBom.getName(), createResolvedBom.map(CreateResolvedBom::getOutputFile),
|
||||
(artifact) -> artifact.builtBy(createResolvedBom));
|
||||
new PublishingCustomizer(project, bom).customize();
|
||||
}
|
||||
|
||||
@@ -25,9 +25,15 @@ import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||
import org.apache.hc.client5.http.impl.classic.HttpClients;
|
||||
import org.gradle.api.DefaultTask;
|
||||
import org.gradle.api.artifacts.Configuration;
|
||||
import org.gradle.api.tasks.TaskAction;
|
||||
import org.gradle.internal.impldep.org.apache.http.client.config.CookieSpecs;
|
||||
|
||||
import org.springframework.boot.build.bom.Library.Link;
|
||||
import org.springframework.boot.build.bom.Library.LinkType;
|
||||
import org.springframework.boot.build.bom.Library.LinkedVersion;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.ResolvedLibrary;
|
||||
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.web.client.RestClient;
|
||||
@@ -46,13 +52,16 @@ public abstract class CheckLinks extends DefaultTask {
|
||||
|
||||
private final BomExtension bom;
|
||||
|
||||
private final Configuration resolvedBom;
|
||||
|
||||
@Inject
|
||||
public CheckLinks(BomExtension bom) {
|
||||
public CheckLinks(BomExtension bom, Configuration resolvedBom) {
|
||||
this.bom = bom;
|
||||
this.resolvedBom = resolvedBom;
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
void releaseNotes() {
|
||||
void check() {
|
||||
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
|
||||
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
|
||||
@@ -60,19 +69,31 @@ public abstract class CheckLinks extends DefaultTask {
|
||||
.requestFactory(requestFactory)
|
||||
.defaultStatusHandler((status) -> true, NOOP_ERROR_HANDLER)
|
||||
.build();
|
||||
for (Library library : this.bom.getLibraries()) {
|
||||
library.getLinks().forEachLink((type, link) -> {
|
||||
URI uri;
|
||||
try {
|
||||
uri = new URI(link.url(library.getVersion()));
|
||||
ResponseEntity<String> response = restClient.head().uri(uri).retrieve().toEntity(String.class);
|
||||
System.out.printf("[%3d] %s - %s (%s)%n", response.getStatusCode().value(), library.getName(), type,
|
||||
uri);
|
||||
}
|
||||
catch (URISyntaxException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
});
|
||||
this.bom.getLibraries().forEach((library) -> check(restClient, library));
|
||||
}
|
||||
|
||||
private void check(RestClient restClient, Library library) {
|
||||
ResolvedBom resolvedBom = ResolvedBom.readFrom(this.resolvedBom.getSingleFile());
|
||||
ResolvedLibrary resolvedLibrary = resolvedBom.library(library);
|
||||
DependencyVersion libraryVersion = library.getVersion();
|
||||
String libraryName = library.getName();
|
||||
library.getLinks().forEachLink((type, link) -> check(restClient, type, link, libraryName, libraryVersion));
|
||||
library.getModuleLinks().forEach((module, links) -> {
|
||||
String moduleName = "%s (%s)".formatted(library.getName(), module);
|
||||
String moduleVersion = resolvedLibrary.module(module).version();
|
||||
links.forEachLink((type, link) -> check(restClient, type, link, moduleName, moduleVersion));
|
||||
});
|
||||
}
|
||||
|
||||
private void check(RestClient restClient, LinkType type, Link link, String name, Object version) {
|
||||
try {
|
||||
URI uri = new URI(link.url(new LinkedVersion(version)));
|
||||
ResponseEntity<String> response = restClient.head().uri(uri).retrieve().toEntity(String.class);
|
||||
int statusCode = response.getStatusCode().value();
|
||||
System.out.printf("[%3d] %s - %s (%s)%n", statusCode, name, type, uri);
|
||||
}
|
||||
catch (URISyntaxException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,6 +85,8 @@ public class Library {
|
||||
|
||||
private final Links links;
|
||||
|
||||
private final Map<String, Links> moduleLinks;
|
||||
|
||||
/**
|
||||
* Create a new {@code Library} with the given {@code name}, {@code version}, and
|
||||
* {@code groups}.
|
||||
@@ -101,11 +103,13 @@ public class Library {
|
||||
* @param bomAlignment the bom, if any, that this library should align with
|
||||
* @param linkRootName the root name to use when generating link variable or
|
||||
* {@code null} to generate one based on the library {@code name}
|
||||
* @param links a list of HTTP links relevant to the library
|
||||
* @param links HTTP links relevant to the library
|
||||
* @param moduleLinks HTTP links relevant to the library modules
|
||||
*/
|
||||
public Library(String name, String calendarName, DependencyVersion version, List<Group> groups,
|
||||
UpgradePolicy upgradePolicy, List<ProhibitedVersion> prohibitedVersions, FirstParty firstParty,
|
||||
VersionAlignment versionAlignment, BomAlignment bomAlignment, String linkRootName, Links links) {
|
||||
VersionAlignment versionAlignment, BomAlignment bomAlignment, String linkRootName, Links links,
|
||||
Map<String, Links> moduleLinks) {
|
||||
this.name = name;
|
||||
this.calendarName = (calendarName != null) ? calendarName : name;
|
||||
this.version = version;
|
||||
@@ -119,6 +123,7 @@ public class Library {
|
||||
this.bomAlignment = bomAlignment;
|
||||
this.linkRootName = (linkRootName != null) ? linkRootName : generateLinkRootName(name);
|
||||
this.links = (links != null) ? links : Links.empty();
|
||||
this.moduleLinks = (links != null) ? moduleLinks : Collections.emptyMap();
|
||||
}
|
||||
|
||||
private static String generateLinkRootName(String name) {
|
||||
@@ -177,6 +182,10 @@ public class Library {
|
||||
return this.links;
|
||||
}
|
||||
|
||||
public Map<String, Links> getModuleLinks() {
|
||||
return this.moduleLinks;
|
||||
}
|
||||
|
||||
public String getLinkUrl(LinkType type) {
|
||||
List<Link> links = getLinks(type);
|
||||
if (links == null || links.isEmpty()) {
|
||||
@@ -199,7 +208,7 @@ public class Library {
|
||||
public Library withVersion(DependencyVersion version) {
|
||||
return new Library(this.name, this.calendarName, version, this.groups, this.upgradePolicy,
|
||||
this.prohibitedVersions, this.firstParty, this.versionAlignment, this.bomAlignment, this.linkRootName,
|
||||
this.links);
|
||||
this.links, this.moduleLinks);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -711,7 +720,7 @@ public class Library {
|
||||
|
||||
}
|
||||
|
||||
public record Link(String rootName, Function<LinkedVersion, String> factory, List<String> packages) {
|
||||
public record Link(Function<LinkedVersion, String> factory, List<String> packages) {
|
||||
|
||||
private static final Pattern PACKAGE_EXPAND = Pattern.compile("^(.*)\\[(.*)\\]$");
|
||||
|
||||
|
||||
@@ -23,10 +23,15 @@ import java.io.UncheckedIOException;
|
||||
import java.io.Writer;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A resolved bom.
|
||||
*
|
||||
@@ -44,6 +49,25 @@ public record ResolvedBom(Id id, List<ResolvedLibrary> libraries) {
|
||||
.build();
|
||||
}
|
||||
|
||||
public ResolvedLibrary library(Library library) {
|
||||
String name = library.getName();
|
||||
List<ResolvedLibrary> matching = libraries().stream()
|
||||
.filter((candidate) -> candidate.name().equals(name))
|
||||
.toList();
|
||||
Assert.state(!matching.isEmpty(), () -> "No library found with name '%s'".formatted(name));
|
||||
Assert.state(matching.size() == 1, () -> "Multiple libraries found with name '%s'".formatted(name));
|
||||
return matching.get(0);
|
||||
}
|
||||
|
||||
public Map<String, String> dependencyVersions() {
|
||||
return allDependencies().collect(Collectors.toMap((id) -> id.groupId() + ":" + id.artifactId(),
|
||||
(id) -> id.version(), (id1, id2) -> id1));
|
||||
}
|
||||
|
||||
public Stream<Id> allDependencies() {
|
||||
return libraries().stream().flatMap(ResolvedLibrary::allDependencies);
|
||||
}
|
||||
|
||||
public static ResolvedBom readFrom(File file) {
|
||||
try (FileReader reader = new FileReader(file)) {
|
||||
return jsonMapper.readValue(reader, ResolvedBom.class);
|
||||
@@ -60,6 +84,28 @@ public record ResolvedBom(Id id, List<ResolvedLibrary> libraries) {
|
||||
public record ResolvedLibrary(String name, String version, String versionProperty, List<Id> managedDependencies,
|
||||
List<Bom> importedBoms, Links links) {
|
||||
|
||||
public Id module(String name) {
|
||||
List<Id> matching = allDependencies().filter((candidate) -> candidate.artifactId().equals(name)).toList();
|
||||
Assert.state(!matching.isEmpty(), () -> "No module found with name '%s'".formatted(name));
|
||||
Assert.state(matching.size() == 1, () -> "Multiple artifacts found with name '%s'".formatted(name));
|
||||
return matching.get(0);
|
||||
}
|
||||
|
||||
public Stream<Id> allDependencies() {
|
||||
return Stream.concat(managedDependencies().stream(), importedBoms().stream().flatMap(Bom::allDependencies));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public record Bom(Id id, Bom parent, List<Id> managedDependencies, List<Bom> importedBoms) {
|
||||
|
||||
public Stream<Id> allDependencies() {
|
||||
Stream<Id> managedAndImportedDependencies = Stream.concat(managedDependencies().stream(),
|
||||
importedBoms().stream().flatMap(Bom::allDependencies));
|
||||
return (parent() != null) ? Stream.concat(parent().allDependencies(), managedAndImportedDependencies)
|
||||
: managedAndImportedDependencies;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public record Id(String groupId, String artifactId, String version, String classifier) implements Comparable<Id> {
|
||||
@@ -96,9 +142,9 @@ public record ResolvedBom(Id id, List<ResolvedLibrary> libraries) {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public record Bom(Id id, Bom parent, List<Id> managedDependencies, List<Bom> importedBoms) {
|
||||
public String groupAndArtifactId() {
|
||||
return groupId() + ":" + artifactId();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
+94
-36
@@ -23,8 +23,12 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.plugins.ExtensionContainer;
|
||||
import org.gradle.api.plugins.ExtraPropertiesExtension;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.build.bom.BomExtension;
|
||||
import org.springframework.boot.build.bom.Library;
|
||||
import org.springframework.boot.build.bom.Library.BomAlignment;
|
||||
import org.springframework.boot.build.bom.Library.FirstParty;
|
||||
@@ -35,10 +39,16 @@ import org.springframework.boot.build.bom.Library.LinkedVersion;
|
||||
import org.springframework.boot.build.bom.Library.Links;
|
||||
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
|
||||
import org.springframework.boot.build.bom.Library.VersionAlignment;
|
||||
import org.springframework.boot.build.bom.ResolvedBom;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.Id;
|
||||
import org.springframework.boot.build.bom.ResolvedBom.ResolvedLibrary;
|
||||
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
|
||||
import org.springframework.boot.build.properties.BuildType;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link AntoraAsciidocAttributes}.
|
||||
@@ -50,57 +60,57 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void buildTypeWhenOpenSource() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("build-type", "opensource");
|
||||
}
|
||||
|
||||
@Test
|
||||
void buildTypeWhenCommercial() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.COMMERCIAL, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.COMMERCIAL, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("build-type", "commercial");
|
||||
}
|
||||
|
||||
@Test
|
||||
void githubRefWhenReleasedVersionIsTag() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("github-ref", "v1.2.3");
|
||||
}
|
||||
|
||||
@Test
|
||||
void githubRefWhenLatestSnapshotVersionIsMainBranch() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", true,
|
||||
BuildType.OPEN_SOURCE, null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-SNAPSHOT", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("github-ref", "main");
|
||||
}
|
||||
|
||||
@Test
|
||||
void githubRefWhenOlderSnapshotVersionIsBranch() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", false,
|
||||
BuildType.OPEN_SOURCE, null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-SNAPSHOT", false, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("github-ref", "1.2.x");
|
||||
}
|
||||
|
||||
@Test
|
||||
void githubRefWhenOlderSnapshotHotFixVersionIsBranch() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3.1-SNAPSHOT", false,
|
||||
BuildType.OPEN_SOURCE, null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3.1-SNAPSHOT", false, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("github-ref", "1.2.3.x");
|
||||
}
|
||||
|
||||
@Test
|
||||
void versionReferenceFromLibrary() {
|
||||
Library library = mockLibrary(Collections.emptyMap());
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3.1-SNAPSHOT", false,
|
||||
BuildType.OPEN_SOURCE, List.of(library), mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3.1-SNAPSHOT", false, BuildType.OPEN_SOURCE,
|
||||
List.of(library), mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("version-spring-framework", "1.2.3");
|
||||
}
|
||||
|
||||
@Test
|
||||
void versionReferenceFromSpringDataDependencyReleaseVersion() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions("3.2.5"), null);
|
||||
assertThat(attributes.get()).containsEntry("version-spring-data-mongodb", "3.2.5");
|
||||
assertThat(attributes.get()).containsEntry("url-spring-data-mongodb-docs",
|
||||
@@ -111,7 +121,7 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void versionReferenceFromSpringDataDependencySnapshotVersion() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions("3.2.0-SNAPSHOT"), null);
|
||||
assertThat(attributes.get()).containsEntry("version-spring-data-mongodb", "3.2.0-SNAPSHOT");
|
||||
assertThat(attributes.get()).containsEntry("url-spring-data-mongodb-docs",
|
||||
@@ -122,35 +132,35 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void versionNativeBuildTools() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), Map.of("nativeBuildToolsVersion", "3.4.5"));
|
||||
assertThat(attributes.get()).containsEntry("version-native-build-tools", "3.4.5");
|
||||
}
|
||||
|
||||
@Test
|
||||
void urlArtifactRepositoryWhenRelease() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("url-artifact-repository", "https://repo.maven.apache.org/maven2");
|
||||
}
|
||||
|
||||
@Test
|
||||
void urlArtifactRepositoryWhenMilestone() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-M1", true, BuildType.OPEN_SOURCE,
|
||||
null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-M1", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("url-artifact-repository", "https://repo.maven.apache.org/maven2");
|
||||
}
|
||||
|
||||
@Test
|
||||
void urlArtifactRepositoryWhenSnapshot() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", true,
|
||||
BuildType.OPEN_SOURCE, null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-SNAPSHOT", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("url-artifact-repository", "https://repo.spring.io/snapshot");
|
||||
}
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenOpenSourceRelease() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "release");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "opensource-release");
|
||||
@@ -158,23 +168,23 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenOpenSourceMilestone() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-M1", true, BuildType.OPEN_SOURCE,
|
||||
null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-M1", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "milestone");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "opensource-milestone");
|
||||
}
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenOpenSourceSnapshot() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", true,
|
||||
BuildType.OPEN_SOURCE, null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-SNAPSHOT", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "snapshot");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "opensource-snapshot");
|
||||
}
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenCommercialRelease() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3", true, BuildType.COMMERCIAL, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3", true, BuildType.COMMERCIAL, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "release");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "commercial-release");
|
||||
@@ -182,7 +192,7 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenCommercialMilestone() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-M1", true, BuildType.COMMERCIAL, null,
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-M1", true, BuildType.COMMERCIAL, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "milestone");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "commercial-milestone");
|
||||
@@ -190,8 +200,8 @@ class AntoraAsciidocAttributesTests {
|
||||
|
||||
@Test
|
||||
void artifactReleaseTypeWhenCommercialSnapshot() {
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", true, BuildType.COMMERCIAL,
|
||||
null, mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3-SNAPSHOT", true, BuildType.COMMERCIAL, null,
|
||||
mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("artifact-release-type", "snapshot");
|
||||
assertThat(attributes.get()).containsEntry("build-and-artifact-release-type", "commercial-snapshot");
|
||||
}
|
||||
@@ -204,8 +214,8 @@ class AntoraAsciidocAttributesTests {
|
||||
links.put(LinkType.JAVADOC,
|
||||
singleLink((version) -> "https://example.com/api/" + version, "org.springframework.[core|util]"));
|
||||
Library library = mockLibrary(links);
|
||||
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3.1-SNAPSHOT", false,
|
||||
BuildType.OPEN_SOURCE, List.of(library), mockDependencyVersions(), null);
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3.1-SNAPSHOT", false, BuildType.OPEN_SOURCE,
|
||||
List.of(library), mockDependencyVersions(), null);
|
||||
assertThat(attributes.get()).containsEntry("url-spring-framework-site", "https://example.com/site/1.2.3")
|
||||
.containsEntry("url-spring-framework-docs", "https://example.com/docs/1.2.3")
|
||||
.containsEntry("url-spring-framework-javadoc", "https://example.com/api/1.2.3");
|
||||
@@ -214,15 +224,31 @@ class AntoraAsciidocAttributesTests {
|
||||
.containsEntry("javadoc-location-org-springframework-util", "{url-spring-framework-javadoc}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void urlLinksFromLibraryModule() {
|
||||
Links links = new Links(Map.of(LinkType.SITE, singleLink((version) -> "https://example.com/site/" + version)));
|
||||
Map<String, Links> moduleLinks = new LinkedHashMap<>();
|
||||
moduleLinks.put("example-module", new Links(Map.of(LinkType.JAVADOC,
|
||||
singleLink((version) -> "https://example.com/moduleapi/" + version, "com.example"))));
|
||||
Library library = mockLibrary(links, moduleLinks);
|
||||
Map<String, String> dependencyVersions = mockDependencyVersions();
|
||||
dependencyVersions.put("example-module", "3.4.5");
|
||||
AntoraAsciidocAttributes attributes = attributes("1.2.3.1-SNAPSHOT", false, BuildType.OPEN_SOURCE,
|
||||
List.of(library), dependencyVersions, null);
|
||||
assertThat(attributes.get()).containsEntry("url-spring-framework-site", "https://example.com/site/1.2.3")
|
||||
.containsEntry("url-example-module-javadoc", "https://example.com/moduleapi/3.4.5");
|
||||
assertThat(attributes.get()).containsEntry("javadoc-location-com-example", "{url-example-module-javadoc}");
|
||||
}
|
||||
|
||||
private List<Link> singleLink(Function<LinkedVersion, String> factory, String... packages) {
|
||||
Link link = new Link(null, factory, List.of(packages));
|
||||
Link link = new Link(factory, List.of(packages));
|
||||
return List.of(link);
|
||||
}
|
||||
|
||||
@Test
|
||||
void linksFromProperties() {
|
||||
Map<String, String> attributes = new AntoraAsciidocAttributes("1.2.3-SNAPSHOT", true, BuildType.OPEN_SOURCE,
|
||||
null, mockDependencyVersions(), null)
|
||||
Map<String, String> attributes = attributes("1.2.3-SNAPSHOT", true, BuildType.OPEN_SOURCE, null,
|
||||
mockDependencyVersions(), null)
|
||||
.get();
|
||||
assertThat(attributes).containsEntry("include-java", "ROOT:example$java/org/springframework/boot/docs");
|
||||
assertThat(attributes).containsEntry("url-spring-data-cassandra-site",
|
||||
@@ -231,7 +257,40 @@ class AntoraAsciidocAttributesTests {
|
||||
assertThat(keys.indexOf("include-java")).isLessThan(keys.indexOf("code-spring-boot-latest"));
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
private AntoraAsciidocAttributes attributes(String version, boolean latestVersion, BuildType buildType,
|
||||
List<Library> libraries, Map<String, String> dependencyVersions, Map<String, ?> projectProperties) {
|
||||
libraries = (libraries != null) ? libraries : Collections.emptyList();
|
||||
projectProperties = (projectProperties != null) ? projectProperties : Collections.emptyMap();
|
||||
Project project = mock();
|
||||
ExtensionContainer extensions = mock();
|
||||
ExtraPropertiesExtension extraPropertiesExtension = mock();
|
||||
given(project.getVersion()).willReturn(version);
|
||||
given(project.findProperty("latestVersion")).willReturn(String.valueOf(latestVersion));
|
||||
given(project.findProperty("spring.build-type"))
|
||||
.willReturn((buildType == BuildType.OPEN_SOURCE) ? "oss" : "commercial");
|
||||
given(project.getProperties()).willReturn((Map) projectProperties);
|
||||
given(project.getExtensions()).willReturn(extensions);
|
||||
given(extensions.getExtraProperties()).willReturn(extraPropertiesExtension);
|
||||
BomExtension dependencyBom = mock();
|
||||
given(dependencyBom.getLibraries()).willReturn(libraries);
|
||||
ResolvedBom resolvedBom = mock();
|
||||
given(resolvedBom.dependencyVersions()).willReturn(dependencyVersions);
|
||||
ResolvedLibrary resolvedLibrary = mock();
|
||||
given(resolvedBom.library(any())).willReturn(resolvedLibrary);
|
||||
given(resolvedLibrary.module(any())).willAnswer((invocation) -> {
|
||||
String moduleName = invocation.getArgument(0);
|
||||
String moduleVersion = dependencyVersions.get(moduleName);
|
||||
return new Id("com.example", moduleName, moduleVersion, null);
|
||||
});
|
||||
return new AntoraAsciidocAttributes(project, dependencyBom, resolvedBom);
|
||||
}
|
||||
|
||||
private Library mockLibrary(Map<LinkType, List<Link>> links) {
|
||||
return mockLibrary(new Links(links), Collections.emptyMap());
|
||||
}
|
||||
|
||||
private Library mockLibrary(Links links, Map<String, Links> moduleLinks) {
|
||||
String name = "Spring Framework";
|
||||
String calendarName = null;
|
||||
DependencyVersion version = DependencyVersion.parse("1.2.3");
|
||||
@@ -241,9 +300,8 @@ class AntoraAsciidocAttributesTests {
|
||||
VersionAlignment versionAlignment = null;
|
||||
BomAlignment alignsWithBom = null;
|
||||
String linkRootName = null;
|
||||
Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, firstParty,
|
||||
versionAlignment, alignsWithBom, linkRootName, new Links(links));
|
||||
return library;
|
||||
return new Library(name, calendarName, version, groups, null, prohibitedVersion, firstParty, versionAlignment,
|
||||
alignsWithBom, linkRootName, links, moduleLinks);
|
||||
}
|
||||
|
||||
private Map<String, String> mockDependencyVersions() {
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.boot.build.bom;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -52,8 +53,9 @@ class LibraryTests {
|
||||
BomAlignment alignsWithBom = null;
|
||||
String linkRootName = null;
|
||||
Links links = null;
|
||||
Map<String, Links> moduleLinks = null;
|
||||
Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, firstParty,
|
||||
versionAlignment, alignsWithBom, linkRootName, links);
|
||||
versionAlignment, alignsWithBom, linkRootName, links, moduleLinks);
|
||||
assertThat(library.getLinkRootName()).isEqualTo("spring-framework");
|
||||
}
|
||||
|
||||
@@ -69,8 +71,9 @@ class LibraryTests {
|
||||
BomAlignment alignsWithBom = null;
|
||||
String linkRootName = "spring-data";
|
||||
Links links = null;
|
||||
Map<String, Links> moduleLinks = null;
|
||||
Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, firstParty,
|
||||
versionAlignment, alignsWithBom, linkRootName, links);
|
||||
versionAlignment, alignsWithBom, linkRootName, links, moduleLinks);
|
||||
assertThat(library.getLinkRootName()).isEqualTo("spring-data");
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ class InteractiveUpgradeResolverTests {
|
||||
libaryUpdateResolver);
|
||||
List<Library> libraries = new ArrayList<>();
|
||||
DependencyVersion version = DependencyVersion.parse("1.0.0");
|
||||
Library library = new Library("test", null, version, null, null, null, null, null, null, null, null);
|
||||
Library library = new Library("test", null, version, null, null, null, null, null, null, null, null, null);
|
||||
libraries.add(library);
|
||||
List<Library> librariesToUpgrade = new ArrayList<>();
|
||||
librariesToUpgrade.add(library);
|
||||
|
||||
+2
-2
@@ -51,7 +51,7 @@ class UpgradeApplicatorTests {
|
||||
File gradleProperties = new File(this.temp, "gradle.properties");
|
||||
FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties);
|
||||
Library activeMq = new Library("ActiveMQ", null, DependencyVersion.parse("5.15.11"), null, null, null, null,
|
||||
null, null, null, null);
|
||||
null, null, null, null, null);
|
||||
new UpgradeApplicator(bom.toPath(), gradleProperties.toPath())
|
||||
.apply(new Upgrade(activeMq, activeMq.withVersion(DependencyVersion.parse("5.16"))));
|
||||
String bomContents = Files.readString(bom.toPath());
|
||||
@@ -65,7 +65,7 @@ class UpgradeApplicatorTests {
|
||||
File gradleProperties = new File(this.temp, "gradle.properties");
|
||||
FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties);
|
||||
Library kotlin = new Library("Kotlin", null, DependencyVersion.parse("1.3.70"), null, null, null, null, null,
|
||||
null, null, null);
|
||||
null, null, null, null);
|
||||
new UpgradeApplicator(bom.toPath(), gradleProperties.toPath())
|
||||
.apply(new Upgrade(kotlin, kotlin.withVersion(DependencyVersion.parse("1.4"))));
|
||||
Properties properties = new Properties();
|
||||
|
||||
@@ -33,7 +33,7 @@ class UpgradeTests {
|
||||
@Test
|
||||
void createToRelease() {
|
||||
Library from = new Library("Test", null, DependencyVersion.parse("1.0.0"), null, null, null, null, null, null,
|
||||
null, null);
|
||||
null, null, null);
|
||||
Upgrade upgrade = new Upgrade(from, from.withVersion(DependencyVersion.parse("1.0.1")));
|
||||
assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0");
|
||||
assertThat(upgrade.to().getNameAndVersion()).isEqualTo("Test 1.0.1");
|
||||
@@ -43,7 +43,7 @@ class UpgradeTests {
|
||||
@Test
|
||||
void createToSnapshot() {
|
||||
Library from = new Library("Test", null, DependencyVersion.parse("1.0.0"), null, null, null, null, null, null,
|
||||
null, null);
|
||||
null, null, null);
|
||||
Upgrade upgrade = new Upgrade(from, from.withVersion(DependencyVersion.parse("1.0.1-SNAPSHOT")),
|
||||
from.withVersion(DependencyVersion.parse("1.0.1")));
|
||||
assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0");
|
||||
|
||||
@@ -422,7 +422,9 @@ bom {
|
||||
}
|
||||
links {
|
||||
releaseNotes(version -> "https://www.elastic.co/docs/release-notes/elasticsearch/clients/java/%s".formatted(version.toString("-")))
|
||||
javadoc("elasticsearch-java", version -> "https://javadoc.io/doc/co.elastic.clients/elasticsearch-java/%s/index.html".formatted(version), "co.elastic.clients.elasticsearch", "co.elastic.clients.transport")
|
||||
module("elasticsearch-java") {
|
||||
javadoc(version -> "https://javadoc.io/doc/co.elastic.clients/elasticsearch-java/%s/index.html".formatted(version), "co.elastic.clients.elasticsearch", "co.elastic.clients.transport")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Flyway", "12.11.0") {
|
||||
@@ -966,10 +968,14 @@ bom {
|
||||
]
|
||||
}
|
||||
links {
|
||||
javadoc("jakarta-websocket-server", version -> "https://jakarta.ee/specifications/websocket/%s.%s/apidocs/server"
|
||||
.formatted(version.major(), version.minor()), "jakarta.websocket.server")
|
||||
javadoc("jakarta-websocket-client", version -> "https://jakarta.ee/specifications/websocket/%s.%s/apidocs/client"
|
||||
.formatted(version.major(), version.minor()), "jakarta.websocket")
|
||||
module("jakarta.websocket-api") {
|
||||
javadoc( version -> "https://jakarta.ee/specifications/websocket/%s.%s/apidocs/server"
|
||||
.formatted(version.major(), version.minor()), "jakarta.websocket.server")
|
||||
}
|
||||
module("jakarta.websocket-client-api") {
|
||||
javadoc(version -> "https://jakarta.ee/specifications/websocket/%s.%s/apidocs/client"
|
||||
.formatted(version.major(), version.minor()), "jakarta.websocket")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Jakarta WS RS", "4.0.0") {
|
||||
@@ -1242,10 +1248,14 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://junit.org/junit5")
|
||||
javadoc("junit-platform-engine", version -> "https://junit.org/junit5/docs/%s/api/org.junit.platform.engine".formatted(version), "org.junit.platform")
|
||||
javadoc("junit-jupiter-api", version -> "https://junit.org/junit5/docs/%s/api/org.junit.jupiter.api".formatted(version), "org.junit.jupiter.api")
|
||||
docs("https://junit.org/junit5/docs/{version}/user-guide")
|
||||
releaseNotes("https://junit.org/junit5/docs/{version}/release-notes")
|
||||
module("junit-platform-engine") {
|
||||
javadoc(version -> "https://junit.org/junit5/docs/%s/api/org.junit.platform.engine".formatted(version), "org.junit.platform")
|
||||
}
|
||||
module("junit-jupiter-api") {
|
||||
javadoc(version -> "https://junit.org/junit5/docs/%s/api/org.junit.jupiter.api".formatted(version), "org.junit.jupiter.api")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Kafka", "4.3.1") {
|
||||
@@ -1374,10 +1384,14 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://logging.apache.org/log4j")
|
||||
javadoc("log4j-api", version -> "https://logging.apache.org/log4j/%s.x/javadoc/log4j-api".formatted(version.major()))
|
||||
javadoc("log4j-core", version -> "https://logging.apache.org/log4j/%s.x/javadoc/log4j-core".formatted(version.major()), "org.apache.logging.log4j.core")
|
||||
docs(version -> "https://logging.apache.org/log4j/%s.x/manual".formatted(version.major()))
|
||||
releaseNotes("https://github.com/apache/logging-log4j2/releases/tag/rel%2F{version}")
|
||||
module("log4j-api") {
|
||||
javadoc(version -> "https://logging.apache.org/log4j/%s.x/javadoc/log4j-api".formatted(version.major()))
|
||||
}
|
||||
module("log4j-core") {
|
||||
javadoc(version -> "https://logging.apache.org/log4j/%s.x/javadoc/log4j-core".formatted(version.major()), "org.apache.logging.log4j.core")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Logback", "1.6.1") {
|
||||
@@ -1632,15 +1646,27 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://micrometer.io")
|
||||
javadoc("micrometer-core", version -> "https://javadoc.io/doc/io.micrometer/micrometer-core/%s".formatted(version), "io.micrometer.core")
|
||||
javadoc("micrometer-observation", version -> "https://javadoc.io/doc/io.micrometer/micrometer-observation/%s".formatted(version), "io.micrometer.observation")
|
||||
javadoc("micrometer-registry-graphite", version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-graphite/%s".formatted(version), "io.micrometer.graphite")
|
||||
javadoc("micrometer-registry-otlp", version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-otlp/%s".formatted(version), "io.micrometer.registry.otlp")
|
||||
javadoc("micrometer-registry-jmx", version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-jmx/%s".formatted(version), "io.micrometer.jmx")
|
||||
javadoc("micrometer-new-relic", version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-new-relic/%s".formatted(version), "io.micrometer.newrelic")
|
||||
docs(version -> "https://docs.micrometer.io/micrometer/reference/%s.%s"
|
||||
.formatted(version.major(), version.minor()))
|
||||
releaseNotes("https://github.com/micrometer-metrics/micrometer/releases/tag/v{version}")
|
||||
module("micrometer-core") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-core/%s".formatted(version), "io.micrometer.core")
|
||||
}
|
||||
module("micrometer-observation") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-observation/%s".formatted(version), "io.micrometer.observation")
|
||||
}
|
||||
module("micrometer-registry-graphite") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-graphite/%s".formatted(version), "io.micrometer.graphite")
|
||||
}
|
||||
module("micrometer-registry-otlp") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-otlp/%s".formatted(version), "io.micrometer.registry.otlp")
|
||||
}
|
||||
module("micrometer-registry-jmx") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-jmx/%s".formatted(version), "io.micrometer.jmx")
|
||||
}
|
||||
module("micrometer-registry-new-relic") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.micrometer/micrometer-registry-new-relic/%s".formatted(version), "io.micrometer.newrelic")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Micrometer Tracing", "1.8.0-M1") {
|
||||
@@ -1678,10 +1704,14 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://github.com/mongodb/mongo-java-driver")
|
||||
// Mongo has split packages so we can't use them
|
||||
javadoc("mongodb-driver-core", version -> "https://mongodb.github.io/mongo-java-driver/%s.%s/apidocs/mongodb-driver-core".formatted(version.major(), version.minor()))
|
||||
javadoc("mongodb-driver-sync", version -> "https://mongodb.github.io/mongo-java-driver/%s.%s/apidocs/mongodb-driver-sync".formatted(version.major(), version.minor()))
|
||||
releaseNotes("https://github.com/mongodb/mongo-java-driver/releases/tag/r{version}")
|
||||
// Mongo has split packages so we can't link by package name
|
||||
module("mongodb-driver-core") {
|
||||
javadoc(version -> "https://mongodb.github.io/mongo-java-driver/%s.%s/apidocs/mongodb-driver-core".formatted(version.major(), version.minor()))
|
||||
}
|
||||
module("mongodb-driver-sync") {
|
||||
javadoc(version -> "https://mongodb.github.io/mongo-java-driver/%s.%s/apidocs/mongodb-driver-sync".formatted(version.major(), version.minor()))
|
||||
}
|
||||
}
|
||||
}
|
||||
library("MSSQL JDBC", "13.4.0.jre11") {
|
||||
@@ -1788,14 +1818,28 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://github.com/open-telemetry/opentelemetry-java")
|
||||
javadoc("opentelemetry-api", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-api/%s".formatted(version), "io.opentelemetry.api")
|
||||
javadoc("opentelemetry-context", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-context/%s".formatted(version), "io.opentelemetry.context")
|
||||
javadoc("opentelemetry-sdk-common", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-common/%s".formatted(version), "io.opentelemetry.sdk.common", "io.opentelemetry.sdk.resources")
|
||||
javadoc("opentelemetry-sdk-logs", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs/%s".formatted(version), "io.opentelemetry.sdk.logs")
|
||||
javadoc("opentelemetry-sdk-metrics", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics/%s".formatted(version), "io.opentelemetry.sdk.metrics")
|
||||
javadoc("opentelemetry-sdk-trace", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace/%s".formatted(version), "io.opentelemetry.sdk.trace")
|
||||
javadoc("opentelemetry-exporter-otlp", version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp/%s".formatted(version), "io.opentelemetry.exporter.otlp")
|
||||
releaseNotes("https://github.com/open-telemetry/opentelemetry-java/releases/tag/v{version}")
|
||||
module("opentelemetry-api") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-api/%s".formatted(version), "io.opentelemetry.api")
|
||||
}
|
||||
module("opentelemetry-context") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-context/%s".formatted(version), "io.opentelemetry.context")
|
||||
}
|
||||
module("opentelemetry-sdk-common") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-common/%s".formatted(version), "io.opentelemetry.sdk.common", "io.opentelemetry.sdk.resources")
|
||||
}
|
||||
module("opentelemetry-sdk-logs") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs/%s".formatted(version), "io.opentelemetry.sdk.logs")
|
||||
}
|
||||
module("opentelemetry-sdk-metrics") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics/%s".formatted(version), "io.opentelemetry.sdk.metrics")
|
||||
}
|
||||
module("opentelemetry-sdk-trace") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace/%s".formatted(version), "io.opentelemetry.sdk.trace")
|
||||
}
|
||||
module("opentelemetry-exporter-otlp") {
|
||||
javadoc(version -> "https://javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp/%s".formatted(version), "io.opentelemetry.exporter.otlp")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Oracle Database", "23.26.3.0.0") {
|
||||
@@ -1895,8 +1939,10 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://github.com/prometheus/client_java")
|
||||
javadoc("prometheus-metrics-tracer-common", (version) -> "https://javadoc.io/doc/io.prometheus/prometheus-metrics-tracer-common/%s".formatted(version), "io.prometheus.metrics.tracer.common")
|
||||
releaseNotes("https://github.com/prometheus/client_java/releases/tag/v{version}")
|
||||
module("prometheus-metrics-tracer-common") {
|
||||
javadoc((version) -> "https://javadoc.io/doc/io.prometheus/prometheus-metrics-tracer-common/%s".formatted(version), "io.prometheus.metrics.tracer.common")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Prometheus Simpleclient", "0.16.0") {
|
||||
@@ -1905,8 +1951,10 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://github.com/prometheus/client_java")
|
||||
javadoc("prometheus-simpleclient-tracer-common", (version) -> "https://javadoc.io/doc/io.prometheus/simpleclient_tracer_common/%s".formatted(version), "io.prometheus.client.exemplars.tracer.common")
|
||||
releaseNotes("https://github.com/prometheus/client_java/releases/tag/parent-{version}")
|
||||
module("simpleclient_tracer_common") {
|
||||
javadoc((version) -> "https://javadoc.io/doc/io.prometheus/simpleclient_tracer_common/%s".formatted(version), "io.prometheus.client.exemplars.tracer.common")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Pulsar", "4.2.4") {
|
||||
@@ -2804,30 +2852,75 @@ bom {
|
||||
}
|
||||
links {
|
||||
docs("https://java.testcontainers.org")
|
||||
javadoc("testcontainers", version -> "https://javadoc.io/doc/org.testcontainers/testcontainers/%s".formatted(version), "org.testcontainers")
|
||||
javadoc("testcontainers-activemq", version -> "https://javadoc.io/doc/org.testcontainers/activemq/%s".formatted(version), "org.testcontainers.activemq")
|
||||
javadoc("testcontainers-cassandra", version -> "https://javadoc.io/doc/org.testcontainers/cassandra/%s".formatted(version))
|
||||
javadoc("testcontainers-clickhouse", version -> "https://javadoc.io/doc/org.testcontainers/clickhouse/%s".formatted(version), "org.testcontainers.clickhouse")
|
||||
javadoc("testcontainers-couchbase", version -> "https://javadoc.io/doc/org.testcontainers/couchbase/%s".formatted(version), "org.testcontainers.couchbase")
|
||||
javadoc("testcontainers-elasticsearch", version -> "https://javadoc.io/doc/org.testcontainers/elasticsearch/%s".formatted(version), "org.testcontainers.elasticsearch")
|
||||
javadoc("testcontainers-grafana", version -> "https://javadoc.io/doc/org.testcontainers/grafana/%s".formatted(version), "org.testcontainers.grafana")
|
||||
javadoc("testcontainers-jdbc", version -> "https://javadoc.io/doc/org.testcontainers/jdbc/%s".formatted(version))
|
||||
javadoc("testcontainers-junit-jupiter", version -> "https://javadoc.io/doc/org.testcontainers/junit-jupiter/%s".formatted(version), "org.testcontainers.junit.jupiter")
|
||||
javadoc("testcontainers-kafka", version -> "https://javadoc.io/doc/org.testcontainers/kafka/%s".formatted(version), "org.testcontainers.kafka")
|
||||
javadoc("testcontainers-mariadb", version -> "https://javadoc.io/doc/org.testcontainers/mariadb/%s".formatted(version))
|
||||
javadoc("testcontainers-mongodb", version -> "https://javadoc.io/doc/org.testcontainers/mongodb/%s".formatted(version))
|
||||
javadoc("testcontainers-mssqlserver", version -> "https://javadoc.io/doc/org.testcontainers/mssqlserver/%s".formatted(version))
|
||||
javadoc("testcontainers-mysql", version -> "https://javadoc.io/doc/org.testcontainers/mysql/%s".formatted(version))
|
||||
javadoc("testcontainers-neo4j", version -> "https://javadoc.io/doc/org.testcontainers/neo4j/%s".formatted(version))
|
||||
javadoc("testcontainers-oracle-xe", version -> "https://javadoc.io/doc/org.testcontainers/oracle-xe/%s".formatted(version))
|
||||
javadoc("testcontainers-oracle-free", version -> "https://javadoc.io/doc/org.testcontainers/oracle-free/%s".formatted(version), "org.testcontainers.oracle")
|
||||
javadoc("testcontainers-postgresql", version -> "https://javadoc.io/doc/org.testcontainers/postgresql/%s".formatted(version))
|
||||
javadoc("testcontainers-pulsar", version -> "https://javadoc.io/doc/org.testcontainers/pulsar/%s".formatted(version))
|
||||
javadoc("testcontainers-rabbitmq", version -> "https://javadoc.io/doc/org.testcontainers/rabbitmq/%s".formatted(version))
|
||||
javadoc("testcontainers-redpanda", version -> "https://javadoc.io/doc/org.testcontainers/redpanda/%s".formatted(version), "org.testcontainers.redpanda")
|
||||
javadoc("testcontainers-r2dbc", version -> "https://javadoc.io/doc/org.testcontainers/r2dbc/%s".formatted(version), "org.testcontainers.r2dbc")
|
||||
releaseNotes("https://github.com/testcontainers/testcontainers-java/releases/tag/{version}")
|
||||
site("https://java.testcontainers.org")
|
||||
module("testcontainers") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/testcontainers/%s".formatted(version), "org.testcontainers")
|
||||
}
|
||||
module("testcontainers-activemq") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/activemq/%s".formatted(version), "org.testcontainers.activemq")
|
||||
}
|
||||
module("testcontainers-cassandra") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/cassandra/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-clickhouse") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/clickhouse/%s".formatted(version), "org.testcontainers.clickhouse")
|
||||
}
|
||||
module("testcontainers-couchbase") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/couchbase/%s".formatted(version), "org.testcontainers.couchbase")
|
||||
}
|
||||
module("testcontainers-elasticsearch") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/elasticsearch/%s".formatted(version), "org.testcontainers.elasticsearch")
|
||||
}
|
||||
module("testcontainers-grafana") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/grafana/%s".formatted(version), "org.testcontainers.grafana")
|
||||
}
|
||||
module("testcontainers-jdbc") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/jdbc/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-junit-jupiter") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/junit-jupiter/%s".formatted(version), "org.testcontainers.junit.jupiter")
|
||||
}
|
||||
module("testcontainers-kafka") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/kafka/%s".formatted(version), "org.testcontainers.kafka")
|
||||
}
|
||||
module("testcontainers-mariadb") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/mariadb/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-mongodb") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/mongodb/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-mssqlserver") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/mssqlserver/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-mysql") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/mysql/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-neo4j") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/neo4j/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-oracle-xe") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/oracle-xe/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-oracle-free") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/oracle-free/%s".formatted(version), "org.testcontainers.oracle")
|
||||
}
|
||||
module("testcontainers-postgresql") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/postgresql/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-pulsar") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/pulsar/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-rabbitmq") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/rabbitmq/%s".formatted(version))
|
||||
}
|
||||
module("testcontainers-redpanda") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/redpanda/%s".formatted(version), "org.testcontainers.redpanda")
|
||||
}
|
||||
module("testcontainers-r2dbc") {
|
||||
javadoc(version -> "https://javadoc.io/doc/org.testcontainers/r2dbc/%s".formatted(version), "org.testcontainers.r2dbc")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
library("Testcontainers Redis Module", "2.2.4") {
|
||||
@@ -2850,9 +2943,13 @@ bom {
|
||||
}
|
||||
links {
|
||||
site("https://www.thymeleaf.org")
|
||||
javadoc("thymeleaf", version -> "https://www.thymeleaf.org/apidocs/thymeleaf/%s".formatted(version), "org.thymeleaf")
|
||||
javadoc("thymeleaf-spring6", version -> "https://www.thymeleaf.org/apidocs/thymeleaf-spring6/%s".formatted(version), "org.thymeleaf.spring6")
|
||||
releaseNotes("https://github.com/thymeleaf/thymeleaf/releases/tag/thymeleaf-{version}")
|
||||
module("thymeleaf") {
|
||||
javadoc(version -> "https://www.thymeleaf.org/apidocs/thymeleaf/%s".formatted(version), "org.thymeleaf")
|
||||
}
|
||||
module("thymeleaf-spring6") {
|
||||
javadoc(version -> "https://www.thymeleaf.org/apidocs/thymeleaf-spring6/%s".formatted(version), "org.thymeleaf.spring6")
|
||||
}
|
||||
}
|
||||
}
|
||||
library("Thymeleaf Extras Data Attribute", "2.0.1") {
|
||||
|
||||
Reference in New Issue
Block a user