Browse Source

Merge branch '3.3.x' into 3.4.x

Closes gh-44903
pull/44507/head
Andy Wilkinson 9 months ago
parent
commit
056429a65c
  1. 37
      buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java
  2. 5
      buildSrc/src/main/java/org/springframework/boot/build/bom/BomResolver.java
  3. 158
      buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java
  4. 28
      buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java
  5. 6
      buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java
  6. 34
      buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java
  7. 200
      spring-boot-project/spring-boot-dependencies/build.gradle
  8. 6
      spring-boot-project/spring-boot-parent/build.gradle

37
buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java

@ -40,9 +40,11 @@ import org.gradle.api.plugins.JavaPlatformPlugin;
import org.springframework.boot.build.bom.Library.Exclusion; import org.springframework.boot.build.bom.Library.Exclusion;
import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.ImportedBom;
import org.springframework.boot.build.bom.Library.LibraryVersion; import org.springframework.boot.build.bom.Library.LibraryVersion;
import org.springframework.boot.build.bom.Library.Link; import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.Library.PermittedDependency;
import org.springframework.boot.build.bom.Library.ProhibitedVersion; import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.Library.VersionAlignment;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@ -152,8 +154,8 @@ public class BomExtension {
for (Module module : group.getModules()) { for (Module module : group.getModules()) {
addModule(library, dependencies, versionProperty, group, module); addModule(library, dependencies, versionProperty, group, module);
} }
for (String bomImport : group.getBoms()) { for (ImportedBom bomImport : group.getBoms()) {
addBomImport(library, dependencies, versionProperty, group, bomImport); addBomImport(library, dependencies, versionProperty, group, bomImport.name());
} }
} }
} }
@ -176,6 +178,8 @@ public class BomExtension {
public static class LibraryHandler { public static class LibraryHandler {
private final Project project;
private final List<Group> groups = new ArrayList<>(); private final List<Group> groups = new ArrayList<>();
private final List<ProhibitedVersion> prohibitedVersions = new ArrayList<>(); private final List<ProhibitedVersion> prohibitedVersions = new ArrayList<>();
@ -194,6 +198,7 @@ public class BomExtension {
@Inject @Inject
public LibraryHandler(Project project, String version) { public LibraryHandler(Project project, String version) {
this.project = project;
this.version = version; this.version = version;
this.alignWith = project.getObjects().newInstance(AlignWithHandler.class); this.alignWith = project.getObjects().newInstance(AlignWithHandler.class);
} }
@ -211,7 +216,7 @@ public class BomExtension {
} }
public void group(String id, Action<GroupHandler> action) { public void group(String id, Action<GroupHandler> action) {
GroupHandler groupHandler = new GroupHandler(id); GroupHandler groupHandler = this.project.getObjects().newInstance(GroupHandler.class, id);
action.execute(groupHandler); action.execute(groupHandler);
this.groups this.groups
.add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports)); .add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports));
@ -290,16 +295,17 @@ public class BomExtension {
} }
public class GroupHandler extends GroovyObjectSupport { public static class GroupHandler extends GroovyObjectSupport {
private final String id; private final String id;
private List<Module> modules = new ArrayList<>(); private List<Module> modules = new ArrayList<>();
private List<String> imports = new ArrayList<>(); private List<ImportedBom> imports = new ArrayList<>();
private List<String> plugins = new ArrayList<>(); private List<String> plugins = new ArrayList<>();
@Inject
public GroupHandler(String id) { public GroupHandler(String id) {
this.id = id; this.id = id;
} }
@ -310,8 +316,14 @@ public class BomExtension {
.toList(); .toList();
} }
public void setImports(List<String> imports) { public void bom(String bom) {
this.imports = imports; this.imports.add(new ImportedBom(bom));
}
public void bom(String bom, Action<ImportBomHandler> action) {
ImportBomHandler handler = new ImportBomHandler();
action.execute(handler);
this.imports.add(new ImportedBom(bom, handler.permittedDependencies));
} }
public void setPlugins(List<String> plugins) { public void setPlugins(List<String> plugins) {
@ -353,6 +365,17 @@ public class BomExtension {
} }
public class ImportBomHandler {
private final List<PermittedDependency> permittedDependencies = new ArrayList<>();
public void permit(String allowed) {
String[] components = allowed.split(":");
this.permittedDependencies.add(new PermittedDependency(components[0], components[1]));
}
}
} }
public static class AlignWithHandler { public static class AlignWithHandler {

5
buildSrc/src/main/java/org/springframework/boot/build/bom/BomResolver.java

@ -42,6 +42,7 @@ import org.w3c.dom.Document;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.ImportedBom;
import org.springframework.boot.build.bom.Library.Link; import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.ResolvedBom.Bom; import org.springframework.boot.build.bom.ResolvedBom.Bom;
@ -84,9 +85,9 @@ class BomResolver {
Id id = new Id(group.getId(), module.getName(), library.getVersion().getVersion().toString()); Id id = new Id(group.getId(), module.getName(), library.getVersion().getVersion().toString());
managedDependencies.add(id); managedDependencies.add(id);
} }
for (String imported : group.getBoms()) { for (ImportedBom imported : group.getBoms()) {
Bom bom = bomFrom(resolveBom( Bom bom = bomFrom(resolveBom(
"%s:%s:%s".formatted(group.getId(), imported, library.getVersion().getVersion()))); "%s:%s:%s".formatted(group.getId(), imported.name(), library.getVersion().getVersion())));
imports.add(bom); imports.add(bom);
} }
} }

158
buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java

@ -17,7 +17,11 @@
package org.springframework.boot.build.bom; package org.springframework.boot.build.bom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
@ -42,7 +46,9 @@ import org.gradle.api.tasks.PathSensitivity;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.ImportedBom;
import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.Library.PermittedDependency;
import org.springframework.boot.build.bom.Library.ProhibitedVersion; import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.Library.VersionAlignment;
import org.springframework.boot.build.bom.ResolvedBom.Bom; import org.springframework.boot.build.bom.ResolvedBom.Bom;
@ -69,7 +75,8 @@ public abstract class CheckBom extends DefaultTask {
Provider<ResolvedBom> resolvedBom = getResolvedBomFile().map(RegularFile::getAsFile).map(ResolvedBom::readFrom); Provider<ResolvedBom> resolvedBom = getResolvedBomFile().map(RegularFile::getAsFile).map(ResolvedBom::readFrom);
this.checks = List.of(new CheckExclusions(configurations, dependencies), new CheckProhibitedVersions(), this.checks = List.of(new CheckExclusions(configurations, dependencies), new CheckProhibitedVersions(),
new CheckVersionAlignment(), new CheckVersionAlignment(),
new CheckDependencyManagementAlignment(resolvedBom, configurations, dependencies)); new CheckDependencyManagementAlignment(resolvedBom, configurations, dependencies),
new CheckForUnwantedDependencyManagement(resolvedBom));
this.bom = bom; this.bom = bom;
} }
@ -241,31 +248,22 @@ public abstract class CheckBom extends DefaultTask {
} }
private static final class CheckDependencyManagementAlignment implements LibraryCheck { private abstract static class ResolvedLibraryCheck implements LibraryCheck {
private final Provider<ResolvedBom> resolvedBom; private final Provider<ResolvedBom> resolvedBom;
private final BomResolver bomResolver; private ResolvedLibraryCheck(Provider<ResolvedBom> resolvedBom) {
private CheckDependencyManagementAlignment(Provider<ResolvedBom> resolvedBom,
ConfigurationContainer configurations, DependencyHandler dependencies) {
this.resolvedBom = resolvedBom; this.resolvedBom = resolvedBom;
this.bomResolver = new BomResolver(configurations, dependencies);
} }
@Override @Override
public List<String> check(Library library) { public List<String> check(Library library) {
List<String> errors = new ArrayList<>(); ResolvedLibrary resolvedLibrary = getResolvedLibrary(library);
String alignsWithBom = library.getAlignsWithBom(); return check(library, resolvedLibrary);
if (alignsWithBom != null) {
Bom mavenBom = this.bomResolver
.resolveMavenBom(alignsWithBom + ":" + library.getVersion().getVersion());
ResolvedLibrary resolvedLibrary = getResolvedLibrary(library);
checkDependencyManagementAlignment(resolvedLibrary, mavenBom, errors);
}
return errors;
} }
protected abstract List<String> check(Library library, ResolvedLibrary resolvedLibrary);
private ResolvedLibrary getResolvedLibrary(Library library) { private ResolvedLibrary getResolvedLibrary(Library library) {
ResolvedBom resolvedBom = this.resolvedBom.get(); ResolvedBom resolvedBom = this.resolvedBom.get();
Optional<ResolvedLibrary> resolvedLibrary = resolvedBom.libraries() Optional<ResolvedLibrary> resolvedLibrary = resolvedBom.libraries()
@ -278,6 +276,30 @@ public abstract class CheckBom extends DefaultTask {
return resolvedLibrary.get(); return resolvedLibrary.get();
} }
}
private static final class CheckDependencyManagementAlignment extends ResolvedLibraryCheck {
private final BomResolver bomResolver;
private CheckDependencyManagementAlignment(Provider<ResolvedBom> resolvedBom,
ConfigurationContainer configurations, DependencyHandler dependencies) {
super(resolvedBom);
this.bomResolver = new BomResolver(configurations, dependencies);
}
@Override
public List<String> check(Library library, ResolvedLibrary resolvedLibrary) {
List<String> errors = new ArrayList<>();
String alignsWithBom = library.getAlignsWithBom();
if (alignsWithBom != null) {
Bom mavenBom = this.bomResolver
.resolveMavenBom(alignsWithBom + ":" + library.getVersion().getVersion());
checkDependencyManagementAlignment(resolvedLibrary, mavenBom, errors);
}
return errors;
}
private void checkDependencyManagementAlignment(ResolvedLibrary library, Bom mavenBom, List<String> errors) { private void checkDependencyManagementAlignment(ResolvedLibrary library, Bom mavenBom, List<String> errors) {
List<Id> managedByLibrary = library.managedDependencies(); List<Id> managedByLibrary = library.managedDependencies();
List<Id> managedByBom = managedDependenciesOf(mavenBom); List<Id> managedByBom = managedDependenciesOf(mavenBom);
@ -316,4 +338,108 @@ public abstract class CheckBom extends DefaultTask {
} }
private static final class CheckForUnwantedDependencyManagement extends ResolvedLibraryCheck {
private CheckForUnwantedDependencyManagement(Provider<ResolvedBom> resolvedBom) {
super(resolvedBom);
}
@Override
public List<String> check(Library library, ResolvedLibrary resolvedLibrary) {
Map<String, Set<String>> unwanted = findUnwantedDependencyManagement(library, resolvedLibrary);
List<String> errors = new ArrayList<>();
if (!unwanted.isEmpty()) {
StringBuilder error = new StringBuilder("Unwanted dependency management:");
unwanted.forEach((bom, dependencies) -> {
error.append("%n - %s:".formatted(bom));
error.append("%n - %s".formatted(String.join("\n - ", dependencies)));
});
errors.add(error.toString());
}
Map<String, Set<String>> unnecessary = findUnnecessaryPermittedDependencies(library, resolvedLibrary);
if (!unnecessary.isEmpty()) {
StringBuilder error = new StringBuilder("Dependencies permitted unnecessarily:");
unnecessary.forEach((bom, dependencies) -> {
error.append("%n - %s:".formatted(bom));
error.append("%n - %s".formatted(String.join("\n - ", dependencies)));
});
errors.add(error.toString());
}
return errors;
}
private Map<String, Set<String>> findUnwantedDependencyManagement(Library library,
ResolvedLibrary resolvedLibrary) {
Map<String, Set<String>> unwanted = new LinkedHashMap<>();
for (Bom bom : resolvedLibrary.importedBoms()) {
Set<String> notPermitted = new TreeSet<>();
Set<Id> managedDependencies = managedDependenciesOf(bom);
managedDependencies.stream()
.filter((dependency) -> unwanted(bom, dependency, findPermittedDependencies(library, bom)))
.map(Id::toString)
.forEach(notPermitted::add);
if (!notPermitted.isEmpty()) {
unwanted.put(bom.id().artifactId(), notPermitted);
}
}
return unwanted;
}
private List<PermittedDependency> findPermittedDependencies(Library library, Bom bom) {
for (Group group : library.getGroups()) {
for (ImportedBom importedBom : group.getBoms()) {
if (importedBom.name().equals(bom.id().artifactId()) && group.getId().equals(bom.id().groupId())) {
return importedBom.permittedDependencies();
}
}
}
return Collections.emptyList();
}
private Set<Id> managedDependenciesOf(Bom bom) {
Set<Id> managedDependencies = new TreeSet<>();
if (bom != null) {
managedDependencies.addAll(bom.managedDependencies());
managedDependencies.addAll(managedDependenciesOf(bom.parent()));
for (Bom importedBom : bom.importedBoms()) {
managedDependencies.addAll(managedDependenciesOf(importedBom));
}
}
return managedDependencies;
}
private boolean unwanted(Bom bom, Id managedDependency, List<PermittedDependency> permittedDependencies) {
if (bom.id().groupId().equals(managedDependency.groupId())
|| managedDependency.groupId().startsWith(bom.id().groupId() + ".")) {
return false;
}
for (PermittedDependency permittedDependency : permittedDependencies) {
if (permittedDependency.artifactId().equals(managedDependency.artifactId())
&& permittedDependency.groupId().equals(managedDependency.groupId())) {
return false;
}
}
return true;
}
private Map<String, Set<String>> findUnnecessaryPermittedDependencies(Library library,
ResolvedLibrary resolvedLibrary) {
Map<String, Set<String>> unnecessary = new HashMap<>();
for (Bom bom : resolvedLibrary.importedBoms()) {
Set<String> permittedDependencies = findPermittedDependencies(library, bom).stream()
.map((dependency) -> dependency.groupId() + ":" + dependency.artifactId())
.collect(Collectors.toCollection(TreeSet::new));
Set<String> dependencies = managedDependenciesOf(bom).stream()
.map((dependency) -> dependency.groupId() + ":" + dependency.artifactId())
.collect(Collectors.toCollection(TreeSet::new));
permittedDependencies.removeAll(dependencies);
if (!permittedDependencies.isEmpty()) {
unnecessary.put(bom.id().artifactId(), permittedDependencies);
}
}
return unnecessary;
}
}
} }

28
buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2024 the original author or authors. * Copyright 2012-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -37,6 +37,7 @@ import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.result.DependencyResult; import org.gradle.api.artifacts.result.DependencyResult;
import org.gradle.api.artifacts.result.ResolutionResult;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@ -304,9 +305,9 @@ public class Library {
private final List<String> plugins; private final List<String> plugins;
private final List<String> boms; private final List<ImportedBom> boms;
public Group(String id, List<Module> modules, List<String> plugins, List<String> boms) { public Group(String id, List<Module> modules, List<String> plugins, List<ImportedBom> boms) {
this.id = id; this.id = id;
this.modules = modules; this.modules = modules;
this.plugins = plugins; this.plugins = plugins;
@ -325,7 +326,7 @@ public class Library {
return this.plugins; return this.plugins;
} }
public List<String> getBoms() { public List<ImportedBom> getBoms() {
return this.boms; return this.boms;
} }
@ -459,9 +460,8 @@ public class Library {
Configuration alignmentConfiguration = this.project.getConfigurations() Configuration alignmentConfiguration = this.project.getConfigurations()
.detachedConfiguration(dependencies.toArray(new Dependency[0])); .detachedConfiguration(dependencies.toArray(new Dependency[0]));
Map<String, String> versions = new HashMap<>(); Map<String, String> versions = new HashMap<>();
for (DependencyResult dependency : alignmentConfiguration.getIncoming() ResolutionResult resolutionResult = alignmentConfiguration.getIncoming().getResolutionResult();
.getResolutionResult() for (DependencyResult dependency : resolutionResult.getAllDependencies()) {
.getAllDependencies()) {
versions.put(dependency.getFrom().getModuleVersion().getModule().toString(), versions.put(dependency.getFrom().getModuleVersion().getModule().toString(),
dependency.getFrom().getModuleVersion().getVersion()); dependency.getFrom().getModuleVersion().getVersion());
} }
@ -516,7 +516,7 @@ public class Library {
.flatMap((group) -> group.getBoms() .flatMap((group) -> group.getBoms()
.stream() .stream()
.map((bom) -> this.project.getDependencies() .map((bom) -> this.project.getDependencies()
.platform(group.getId() + ":" + bom + ":" + manager.getVersion().getVersion()))) .platform(group.getId() + ":" + bom.name() + ":" + manager.getVersion().getVersion())))
.toList(); .toList();
} }
@ -571,4 +571,16 @@ public class Library {
} }
public record ImportedBom(String name, List<PermittedDependency> permittedDependencies) {
public ImportedBom(String name) {
this(name, Collections.emptyList());
}
}
public record PermittedDependency(String groupId, String artifactId) {
}
} }

6
buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java

@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.boot.build.bom.Library; import org.springframework.boot.build.bom.Library;
import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.ImportedBom;
import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.Library.VersionAlignment;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@ -112,8 +113,9 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver {
moduleVersions.put(group.getId() + ":" + module.getName(), moduleVersions.put(group.getId() + ":" + module.getName(),
getLaterVersionsForModule(group.getId(), module.getName(), library)); getLaterVersionsForModule(group.getId(), module.getName(), library));
} }
for (String bom : group.getBoms()) { for (ImportedBom bom : group.getBoms()) {
moduleVersions.put(group.getId() + ":" + bom, getLaterVersionsForModule(group.getId(), bom, library)); moduleVersions.put(group.getId() + ":" + bom,
getLaterVersionsForModule(group.getId(), bom.name(), library));
} }
for (String plugin : group.getPlugins()) { for (String plugin : group.getPlugins()) {
moduleVersions.put(group.getId() + ":" + plugin, moduleVersions.put(group.getId() + ":" + plugin,

34
buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -122,9 +122,7 @@ class BomPluginIntegrationTests {
out.println("bom {"); out.println("bom {");
out.println(" library('Jackson Bom', '2.10.0') {"); out.println(" library('Jackson Bom', '2.10.0') {");
out.println(" group('com.fasterxml.jackson') {"); out.println(" group('com.fasterxml.jackson') {");
out.println(" imports = ["); out.println(" bom('jackson-bom')");
out.println(" 'jackson-bom'");
out.println(" ]");
out.println(" }"); out.println(" }");
out.println(" }"); out.println(" }");
out.println("}"); out.println("}");
@ -290,34 +288,6 @@ class BomPluginIntegrationTests {
}); });
} }
// @Test
// void versionAlignmentIsVerified() throws IOException {
// try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) {
// out.println("plugins {");
// out.println(" id 'org.springframework.boot.bom'");
// out.println("}");
// out.println("bom {");
// out.println(" library('OAuth2 OIDC SDK', '8.36.1') {");
// out.println(" alignedWith('Spring Security') {");
// out.println(
// "
// source('https://github.com/spring-projects/spring-security/blob/${libraryVersion}/config/gradle/dependency-locks/optional.lockfile')");
// out.println(" pattern('com.nimbusds:oauth2-oidc-sdk:(.+)')");
// out.println(" }");
// out.println(" group('com.nimbusds') {");
// out.println(" modules = [");
// out.println(" 'oauth2-oidc-sdk'");
// out.println(" ]");
// out.println(" }");
// out.println(" }");
// out.println(" library('Spring Security', '5.4.7') {");
// out.println(" }");
// out.println("}");
// }
// System.out.println(runGradle(DeployedPlugin.GENERATE_POM_TASK_NAME,
// "-s").getOutput());
// }
private BuildResult runGradle(String... args) { private BuildResult runGradle(String... args) {
return GradleRunner.create() return GradleRunner.create()
.withDebug(true) .withDebug(true)

200
spring-boot-project/spring-boot-dependencies/build.gradle

@ -22,9 +22,7 @@ bom {
exclude group: "commons-logging", module: "commons-logging" exclude group: "commons-logging", module: "commons-logging"
} }
] ]
imports = [ bom("activemq-bom")
"activemq-bom"
]
} }
links { links {
site("https://activemq.apache.org") site("https://activemq.apache.org")
@ -54,9 +52,9 @@ bom {
} }
library("Artemis", "2.37.0") { library("Artemis", "2.37.0") {
group("org.apache.activemq") { group("org.apache.activemq") {
imports = [ bom("artemis-bom") {
"artemis-bom" permit("org.apache.maven.plugin-tools:maven-plugin-annotations")
] }
} }
links { links {
site("https://activemq.apache.org/components/artemis") site("https://activemq.apache.org/components/artemis")
@ -80,9 +78,7 @@ bom {
} }
library("AssertJ", "${assertjVersion}") { library("AssertJ", "${assertjVersion}") {
group("org.assertj") { group("org.assertj") {
imports = [ bom("assertj-bom")
"assertj-bom"
]
} }
links { links {
site("https://assertj.github.io/doc") site("https://assertj.github.io/doc")
@ -105,9 +101,9 @@ bom {
} }
library("Zipkin Reporter", "3.4.3") { library("Zipkin Reporter", "3.4.3") {
group("io.zipkin.reporter2") { group("io.zipkin.reporter2") {
imports = [ bom("zipkin-reporter-bom") {
"zipkin-reporter-bom" permit("io.zipkin.zipkin2:zipkin")
] }
} }
links { links {
site("https://github.com/openzipkin/zipkin-reporter-java") site("https://github.com/openzipkin/zipkin-reporter-java")
@ -116,9 +112,7 @@ bom {
} }
library("Brave", "6.0.3") { library("Brave", "6.0.3") {
group("io.zipkin.brave") { group("io.zipkin.brave") {
imports = [ bom("brave-bom")
"brave-bom"
]
} }
links { links {
site("https://github.com/openzipkin/brave") site("https://github.com/openzipkin/brave")
@ -183,9 +177,10 @@ bom {
} }
library("Cassandra Driver", "4.18.1") { library("Cassandra Driver", "4.18.1") {
group("org.apache.cassandra") { group("org.apache.cassandra") {
imports = [ bom("java-driver-bom") {
"java-driver-bom" permit("com.datastax.oss:java-driver-shaded-guava")
] permit("com.datastax.oss:native-protocol")
}
modules = [ modules = [
"java-driver-core" "java-driver-core"
] ]
@ -418,9 +413,19 @@ bom {
} }
library("Glassfish JAXB", "4.0.5") { library("Glassfish JAXB", "4.0.5") {
group("org.glassfish.jaxb") { group("org.glassfish.jaxb") {
imports = [ bom("jaxb-bom") {
"jaxb-bom" permit("com.sun.istack:istack-commons-runtime")
] permit("com.sun.xml.bind:jaxb-core")
permit("com.sun.xml.bind:jaxb-impl")
permit("com.sun.xml.bind:jaxb-jxc")
permit("com.sun.xml.bind:jaxb-osgi")
permit("com.sun.xml.bind:jaxb-xjc")
permit("com.sun.xml.fastinfoset:FastInfoset")
permit("jakarta.activation:jakarta.activation-api")
permit("jakarta.xml.bind:jakarta.xml.bind-api")
permit("org.eclipse.angus:angus-activation")
permit("org.jvnet.staxex:stax-ex")
}
} }
links { links {
releaseNotes("https://github.com/eclipse-ee4j/jaxb-ri/releases/tag/{version}-RI") releaseNotes("https://github.com/eclipse-ee4j/jaxb-ri/releases/tag/{version}-RI")
@ -456,9 +461,7 @@ bom {
} }
library("Groovy", "4.0.26") { library("Groovy", "4.0.26") {
group("org.apache.groovy") { group("org.apache.groovy") {
imports = [ bom("groovy-bom")
"groovy-bom"
]
} }
links { links {
site("https://groovy-lang.org") site("https://groovy-lang.org")
@ -625,9 +628,7 @@ bom {
} }
library("Infinispan", "15.0.14.Final") { library("Infinispan", "15.0.14.Final") {
group("org.infinispan") { group("org.infinispan") {
imports = [ bom("infinispan-bom")
"infinispan-bom"
]
} }
links { links {
site("https://infinispan.org") site("https://infinispan.org")
@ -649,9 +650,7 @@ bom {
} }
library("Jackson Bom", "${jacksonVersion}") { library("Jackson Bom", "${jacksonVersion}") {
group("com.fasterxml.jackson") { group("com.fasterxml.jackson") {
imports = [ bom("jackson-bom")
"jackson-bom"
]
} }
links { links {
releaseNotes("https://github.com/FasterXML/jackson/wiki/Jackson-Release-{version}") releaseNotes("https://github.com/FasterXML/jackson/wiki/Jackson-Release-{version}")
@ -969,9 +968,7 @@ bom {
} }
library("Jersey", "3.1.10") { library("Jersey", "3.1.10") {
group("org.glassfish.jersey") { group("org.glassfish.jersey") {
imports = [ bom("jersey-bom")
"jersey-bom"
]
} }
links { links {
site("https://github.com/eclipse-ee4j/jersey") site("https://github.com/eclipse-ee4j/jersey")
@ -988,14 +985,10 @@ bom {
} }
library("Jetty", "12.0.18") { library("Jetty", "12.0.18") {
group("org.eclipse.jetty.ee10") { group("org.eclipse.jetty.ee10") {
imports = [ bom("jetty-ee10-bom")
"jetty-ee10-bom"
]
} }
group("org.eclipse.jetty") { group("org.eclipse.jetty") {
imports = [ bom("jetty-bom")
"jetty-bom"
]
} }
links { links {
site("https://eclipse.dev/jetty") site("https://eclipse.dev/jetty")
@ -1082,9 +1075,7 @@ bom {
} }
library("JUnit Jupiter", "${junitJupiterVersion}") { library("JUnit Jupiter", "${junitJupiterVersion}") {
group("org.junit") { group("org.junit") {
imports = [ bom("junit-bom")
"junit-bom"
]
} }
links { links {
site("https://junit.org/junit5") site("https://junit.org/junit5")
@ -1146,9 +1137,7 @@ bom {
} }
library("Kotlin", "${kotlinVersion}") { library("Kotlin", "${kotlinVersion}") {
group("org.jetbrains.kotlin") { group("org.jetbrains.kotlin") {
imports = [ bom("kotlin-bom")
"kotlin-bom"
]
plugins = [ plugins = [
"kotlin-maven-plugin" "kotlin-maven-plugin"
] ]
@ -1165,9 +1154,7 @@ bom {
because "it requires Kotlin 2" because "it requires Kotlin 2"
} }
group("org.jetbrains.kotlinx") { group("org.jetbrains.kotlinx") {
imports = [ bom("kotlinx-coroutines-bom")
"kotlinx-coroutines-bom"
]
} }
links { links {
site("https://github.com/Kotlin/kotlinx.coroutines") site("https://github.com/Kotlin/kotlinx.coroutines")
@ -1180,9 +1167,7 @@ bom {
because "it requires Kotlin 2" because "it requires Kotlin 2"
} }
group("org.jetbrains.kotlinx") { group("org.jetbrains.kotlinx") {
imports = [ bom("kotlinx-serialization-bom")
"kotlinx-serialization-bom"
]
} }
links { links {
site("https://github.com/Kotlin/kotlinx.serialization") site("https://github.com/Kotlin/kotlinx.serialization")
@ -1220,9 +1205,16 @@ bom {
} }
library("Log4j2", "2.24.3") { library("Log4j2", "2.24.3") {
group("org.apache.logging.log4j") { group("org.apache.logging.log4j") {
imports = [ bom("log4j-bom") {
"log4j-bom" permit("biz.aQute.bnd:biz.aQute.bnd.annotation")
] permit("com.github.spotbugs:spotbugs-annotations")
permit("org.apache.logging:logging-parent")
permit("org.apache.maven.plugin-tools:maven-plugin-annotations")
permit("org.jspecify:jspecify")
permit("org.osgi:org.osgi.annotation.bundle")
permit("org.osgi:org.osgi.annotation.versioning")
permit("org.osgi:osgi.annotation")
}
} }
links { links {
site("https://logging.apache.org/log4j") site("https://logging.apache.org/log4j")
@ -1449,9 +1441,7 @@ bom {
exclude group: "javax.annotation", module: "javax.annotation-api" exclude group: "javax.annotation", module: "javax.annotation-api"
} }
] ]
imports = [ bom("micrometer-bom")
"micrometer-bom"
]
} }
links { links {
site("https://micrometer.io") site("https://micrometer.io")
@ -1468,9 +1458,7 @@ bom {
library("Micrometer Tracing", "1.4.4") { library("Micrometer Tracing", "1.4.4") {
considerSnapshots() considerSnapshots()
group("io.micrometer") { group("io.micrometer") {
imports = [ bom("micrometer-tracing-bom")
"micrometer-tracing-bom"
]
} }
links { links {
site("https://micrometer.io") site("https://micrometer.io")
@ -1482,9 +1470,7 @@ bom {
} }
library("Mockito", "${mockitoVersion}") { library("Mockito", "${mockitoVersion}") {
group("org.mockito") { group("org.mockito") {
imports = [ bom("mockito-bom")
"mockito-bom"
]
} }
links { links {
site("https://site.mockito.org") site("https://site.mockito.org")
@ -1581,9 +1567,7 @@ bom {
} }
library("Netty", "4.1.119.Final") { library("Netty", "4.1.119.Final") {
group("io.netty") { group("io.netty") {
imports = [ bom("netty-bom")
"netty-bom"
]
} }
links { links {
site("https://netty.io") site("https://netty.io")
@ -1592,9 +1576,7 @@ bom {
} }
library("OpenTelemetry", "1.43.0") { library("OpenTelemetry", "1.43.0") {
group("io.opentelemetry") { group("io.opentelemetry") {
imports = [ bom("opentelemetry-bom")
"opentelemetry-bom"
]
} }
links { links {
site("https://github.com/open-telemetry/opentelemetry-java") site("https://github.com/open-telemetry/opentelemetry-java")
@ -1679,9 +1661,7 @@ bom {
} }
library("Prometheus Client", "1.3.6") { library("Prometheus Client", "1.3.6") {
group("io.prometheus") { group("io.prometheus") {
imports = [ bom("prometheus-metrics-bom")
"prometheus-metrics-bom"
]
} }
links { links {
site("https://github.com/prometheus/client_java") site("https://github.com/prometheus/client_java")
@ -1691,9 +1671,7 @@ bom {
} }
library("Prometheus Simpleclient", "0.16.0") { library("Prometheus Simpleclient", "0.16.0") {
group("io.prometheus") { group("io.prometheus") {
imports = [ bom("simpleclient_bom")
"simpleclient_bom"
]
} }
links { links {
site("https://github.com/prometheus/client_java") site("https://github.com/prometheus/client_java")
@ -1703,9 +1681,9 @@ bom {
} }
library("Pulsar", "3.3.5") { library("Pulsar", "3.3.5") {
group("org.apache.pulsar") { group("org.apache.pulsar") {
imports = [ bom("pulsar-bom") {
"pulsar-bom" permit("org.apache.maven.plugin-tools:maven-plugin-annotations")
] }
} }
links { links {
site("https://pulsar.apache.org") site("https://pulsar.apache.org")
@ -1747,9 +1725,7 @@ bom {
} }
library("QueryDSL", "5.1.0") { library("QueryDSL", "5.1.0") {
group("com.querydsl") { group("com.querydsl") {
imports = [ bom("querydsl-bom")
"querydsl-bom"
]
} }
links { links {
site("https://github.com/querydsl/querydsl") site("https://github.com/querydsl/querydsl")
@ -1879,9 +1855,9 @@ bom {
considerSnapshots() considerSnapshots()
calendarName = "Reactor" calendarName = "Reactor"
group("io.projectreactor") { group("io.projectreactor") {
imports = [ bom("reactor-bom") {
"reactor-bom" permit("org.reactivestreams:reactive-streams")
] }
} }
links { links {
site("https://projectreactor.io") site("https://projectreactor.io")
@ -1890,9 +1866,7 @@ bom {
} }
library("REST Assured", "5.5.1") { library("REST Assured", "5.5.1") {
group("io.rest-assured") { group("io.rest-assured") {
imports = [ bom("rest-assured-bom")
"rest-assured-bom"
]
} }
links { links {
javadoc("https://javadoc.io/doc/io.rest-assured/rest-assured/{version}", "io.restassured") javadoc("https://javadoc.io/doc/io.rest-assured/rest-assured/{version}", "io.restassured")
@ -1900,9 +1874,7 @@ bom {
} }
library("RSocket", "1.1.5") { library("RSocket", "1.1.5") {
group("io.rsocket") { group("io.rsocket") {
imports = [ bom("rsocket-bom")
"rsocket-bom"
]
} }
links { links {
site("https://github.com/rsocket/rsocket-java") site("https://github.com/rsocket/rsocket-java")
@ -2020,9 +1992,7 @@ bom {
} }
library("Selenium", "4.25.0") { library("Selenium", "4.25.0") {
group("org.seleniumhq.selenium") { group("org.seleniumhq.selenium") {
imports = [ bom("selenium-bom")
"selenium-bom"
]
} }
links { links {
site("https://www.selenium.dev") site("https://www.selenium.dev")
@ -2079,9 +2049,7 @@ bom {
library("Spring AMQP", "3.2.4") { library("Spring AMQP", "3.2.4") {
considerSnapshots() considerSnapshots()
group("org.springframework.amqp") { group("org.springframework.amqp") {
imports = [ bom("spring-amqp-bom")
"spring-amqp-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-amqp") site("https://spring.io/projects/spring-amqp")
@ -2113,9 +2081,7 @@ bom {
library("Spring Batch", "5.2.2") { library("Spring Batch", "5.2.2") {
considerSnapshots() considerSnapshots()
group("org.springframework.batch") { group("org.springframework.batch") {
imports = [ bom("spring-batch-bom")
"spring-batch-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-batch") site("https://spring.io/projects/spring-batch")
@ -2131,9 +2097,7 @@ bom {
considerSnapshots() considerSnapshots()
calendarName = "Spring Data Release" calendarName = "Spring Data Release"
group("org.springframework.data") { group("org.springframework.data") {
imports = [ bom("spring-data-bom")
"spring-data-bom"
]
} }
links("spring-data") { links("spring-data") {
site("https://spring.io/projects/spring-data") site("https://spring.io/projects/spring-data")
@ -2144,9 +2108,7 @@ bom {
library("Spring Framework", "${springFrameworkVersion}") { library("Spring Framework", "${springFrameworkVersion}") {
considerSnapshots() considerSnapshots()
group("org.springframework") { group("org.springframework") {
imports = [ bom("spring-framework-bom")
"spring-framework-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-framework") site("https://spring.io/projects/spring-framework")
@ -2199,9 +2161,7 @@ bom {
library("Spring Integration", "6.4.3") { library("Spring Integration", "6.4.3") {
considerSnapshots() considerSnapshots()
group("org.springframework.integration") { group("org.springframework.integration") {
imports = [ bom("spring-integration-bom")
"spring-integration-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-integration") site("https://spring.io/projects/spring-integration")
@ -2254,9 +2214,7 @@ bom {
library("Spring Pulsar", "1.2.4") { library("Spring Pulsar", "1.2.4") {
considerSnapshots() considerSnapshots()
group("org.springframework.pulsar") { group("org.springframework.pulsar") {
imports = [ bom("spring-pulsar-bom")
"spring-pulsar-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-pulsar") site("https://spring.io/projects/spring-pulsar")
@ -2271,9 +2229,7 @@ bom {
library("Spring RESTDocs", "3.0.3") { library("Spring RESTDocs", "3.0.3") {
considerSnapshots() considerSnapshots()
group("org.springframework.restdocs") { group("org.springframework.restdocs") {
imports = [ bom("spring-restdocs-bom")
"spring-restdocs-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-restdocs") site("https://spring.io/projects/spring-restdocs")
@ -2301,9 +2257,7 @@ bom {
library("Spring Security", "6.4.4") { library("Spring Security", "6.4.4") {
considerSnapshots() considerSnapshots()
group("org.springframework.security") { group("org.springframework.security") {
imports = [ bom("spring-security-bom")
"spring-security-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-security") site("https://spring.io/projects/spring-security")
@ -2322,9 +2276,7 @@ bom {
because "Spring Session switched to numeric version numbers" because "Spring Session switched to numeric version numbers"
} }
group("org.springframework.session") { group("org.springframework.session") {
imports = [ bom("spring-session-bom")
"spring-session-bom"
]
} }
links { links {
site("https://spring.io/projects/spring-session") site("https://spring.io/projects/spring-session")
@ -2339,9 +2291,7 @@ bom {
library("Spring WS", "4.0.12") { library("Spring WS", "4.0.12") {
considerSnapshots() considerSnapshots()
group("org.springframework.ws") { group("org.springframework.ws") {
imports = [ bom("spring-ws-bom")
"spring-ws-bom"
]
} }
links("spring-webservices") { links("spring-webservices") {
site("https://spring.io/projects/spring-ws") site("https://spring.io/projects/spring-ws")
@ -2366,9 +2316,7 @@ bom {
} }
library("Testcontainers", "1.20.6") { library("Testcontainers", "1.20.6") {
group("org.testcontainers") { group("org.testcontainers") {
imports = [ bom("testcontainers-bom")
"testcontainers-bom"
]
} }
links { links {
site("https://java.testcontainers.org") site("https://java.testcontainers.org")

6
spring-boot-project/spring-boot-parent/build.gradle

@ -64,9 +64,9 @@ bom {
} }
library("Janino", "3.1.10") { library("Janino", "3.1.10") {
group("org.codehaus.janino") { group("org.codehaus.janino") {
imports = [ bom("janino") {
"janino" permit("junit:junit")
] }
} }
} }
library("JLine", "2.11") { library("JLine", "2.11") {

Loading…
Cancel
Save