diff --git a/build-plugin/spring-boot-gradle-plugin/build.gradle b/build-plugin/spring-boot-gradle-plugin/build.gradle index 72ae637daa0..9cb0d2503ab 100644 --- a/build-plugin/spring-boot-gradle-plugin/build.gradle +++ b/build-plugin/spring-boot-gradle-plugin/build.gradle @@ -53,6 +53,7 @@ dependencies { optional("org.cyclonedx:cyclonedx-gradle-plugin") { exclude(group: "javax.annotation", module: "javax.annotation-api") exclude(group: "javax.inject", module: "javax.inject") + exclude(group: "org.slf4j", module: "jcl-over-slf4j") } optional("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") diff --git a/build-plugin/spring-boot-maven-plugin/build.gradle b/build-plugin/spring-boot-maven-plugin/build.gradle index 3bf086c05c2..38305ff3b79 100644 --- a/build-plugin/spring-boot-maven-plugin/build.gradle +++ b/build-plugin/spring-boot-maven-plugin/build.gradle @@ -67,6 +67,7 @@ dependencies { testImplementation("org.apache.maven:maven-core") { exclude(group: "javax.annotation", module: "javax.annotation-api") exclude(group: "javax.inject", module: "javax.inject") + exclude(group: "org.slf4j", module: "jcl-over-slf4j") } testImplementation("org.apache.maven.shared:maven-common-artifact-filters") { exclude(group: "javax.annotation", module: "javax.annotation-api") diff --git a/gradle.properties b/gradle.properties index e878b0942a1..a8a85c81970 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ jacksonVersion=3.1.5 javaFormatVersion=0.0.48 junitJupiterVersion=6.0.3 kotlinVersion=2.2.21 -mavenVersion=3.9.13 +mavenVersion=3.10.0 mockitoVersion=5.20.0 nativeBuildToolsVersion=0.11.5 nullabilityPluginVersion=0.0.15 diff --git a/platform/spring-boot-internal-dependencies/build.gradle b/platform/spring-boot-internal-dependencies/build.gradle index 8b8596ee766..65db67b9115 100644 --- a/platform/spring-boot-internal-dependencies/build.gradle +++ b/platform/spring-boot-internal-dependencies/build.gradle @@ -162,16 +162,16 @@ bom { ] } } - library("Maven Resolver", "1.9.27") { + library("Maven Resolver", "2.0.24") { group("org.apache.maven.resolver") { modules = [ "maven-resolver-api", "maven-resolver-connector-basic", "maven-resolver-impl", "maven-resolver-spi", - "maven-resolver-supplier", + "maven-resolver-supplier-mvn3", + "maven-resolver-transport-apache", "maven-resolver-transport-file", - "maven-resolver-transport-http", "maven-resolver-util" ] } diff --git a/test-support/spring-boot-test-support/build.gradle b/test-support/spring-boot-test-support/build.gradle index 22c5163f886..0b82f85e1cf 100644 --- a/test-support/spring-boot-test-support/build.gradle +++ b/test-support/spring-boot-test-support/build.gradle @@ -47,7 +47,7 @@ dependencies { compileOnly("org.springframework.data:spring-data-redis") implementation("jakarta.inject:jakarta.inject-api") - implementation("org.apache.maven.resolver:maven-resolver-supplier") { + implementation("org.apache.maven.resolver:maven-resolver-supplier-mvn3") { exclude group: "org.slf4j", module: "jcl-over-slf4j" } diff --git a/test-support/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/ModifiedClassPathClassLoader.java b/test-support/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/ModifiedClassPathClassLoader.java index fedbcb8b889..fe6c0ab122a 100644 --- a/test-support/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/ModifiedClassPathClassLoader.java +++ b/test-support/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/ModifiedClassPathClassLoader.java @@ -24,6 +24,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -38,18 +39,17 @@ import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.stream.Stream; -import org.apache.maven.repository.internal.MavenRepositorySystemUtils; -import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession.CloseableSession; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.supplier.RepositorySystemSupplier; +import org.eclipse.aether.supplier.SessionBuilderSupplier; import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotations; @@ -64,6 +64,7 @@ import org.springframework.util.StringUtils; * * @author Andy Wilkinson * @author Christoph Dreis + * @author Moritz Halbritter */ final class ModifiedClassPathClassLoader extends URLClassLoader { @@ -241,27 +242,29 @@ final class ModifiedClassPathClassLoader extends URLClassLoader { private static List resolveCoordinates(String[] coordinates) { return doWithRepositorySystem((repositorySystem) -> { Exception latestFailure = null; - DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); - session.setSystemProperties(System.getProperties()); - LocalRepository localRepository = new LocalRepository(System.getProperty("user.home") + "/.m2/repository"); + Path localRepository = Path.of(System.getProperty("user.home"), ".m2", "repository"); RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2") .build(); - session.setLocalRepositoryManager(repositorySystem.newLocalRepositoryManager(session, localRepository)); - for (int i = 0; i < MAX_RESOLUTION_ATTEMPTS; i++) { - CollectRequest collectRequest = new CollectRequest(null, Arrays.asList(remoteRepository)); - collectRequest.setDependencies(createDependencies(coordinates)); - DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null); - try { - DependencyResult result = repositorySystem.resolveDependencies(session, dependencyRequest); - List resolvedArtifacts = new ArrayList<>(); - for (ArtifactResult artifact : result.getArtifactResults()) { - resolvedArtifacts.add(artifact.getArtifact().getFile().toURI().toURL()); + try (CloseableSession session = new SessionBuilderSupplier(repositorySystem).get() + .setSystemProperties(System.getProperties()) + .withLocalRepositoryBaseDirectories(localRepository) + .build()) { + for (int i = 0; i < MAX_RESOLUTION_ATTEMPTS; i++) { + CollectRequest collectRequest = new CollectRequest(null, Arrays.asList(remoteRepository)); + collectRequest.setDependencies(createDependencies(coordinates)); + DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null); + try { + DependencyResult result = repositorySystem.resolveDependencies(session, dependencyRequest); + List resolvedArtifacts = new ArrayList<>(); + for (ArtifactResult artifact : result.getArtifactResults()) { + resolvedArtifacts.add(artifact.getArtifact().getPath().toUri().toURL()); + } + return resolvedArtifacts; + } + catch (Exception ex) { + latestFailure = ex; } - return resolvedArtifacts; - } - catch (Exception ex) { - latestFailure = ex; } } throw new IllegalStateException("Resolution failed after " + MAX_RESOLUTION_ATTEMPTS + " attempts",