Use new Maven Resolver API for ModifiedClassPathClassLoader

Replace deprecated Maven Resolver components with
`RepositorySystemSupplier`.

See gh-50447

Signed-off-by: Dmytro Nosan <dimanosan@gmail.com>
This commit is contained in:
Dmytro Nosan
2026-05-29 11:51:03 +02:00
committed by Stéphane Nicoll
parent 351a82627b
commit 155b02f0e3
3 changed files with 35 additions and 41 deletions
@@ -150,13 +150,14 @@ bom {
] ]
} }
} }
library("Maven Resolver", "1.9.23") { library("Maven Resolver", "1.9.27") {
group("org.apache.maven.resolver") { group("org.apache.maven.resolver") {
modules = [ modules = [
"maven-resolver-api", "maven-resolver-api",
"maven-resolver-connector-basic", "maven-resolver-connector-basic",
"maven-resolver-impl", "maven-resolver-impl",
"maven-resolver-spi", "maven-resolver-spi",
"maven-resolver-supplier",
"maven-resolver-transport-file", "maven-resolver-transport-file",
"maven-resolver-transport-http", "maven-resolver-transport-http",
"maven-resolver-util" "maven-resolver-util"
@@ -37,12 +37,7 @@ dependencies {
compileOnly("org.springframework.data:spring-data-redis") compileOnly("org.springframework.data:spring-data-redis")
implementation("jakarta.inject:jakarta.inject-api") implementation("jakarta.inject:jakarta.inject-api")
implementation("org.apache.maven.resolver:maven-resolver-connector-basic") implementation("org.apache.maven.resolver:maven-resolver-supplier") {
implementation("org.apache.maven.resolver:maven-resolver-impl")
implementation("org.apache.maven:maven-resolver-provider") {
exclude(group: "javax.inject", module: "javax.inject")
}
implementation("org.apache.maven.resolver:maven-resolver-transport-http") {
exclude group: "org.slf4j", module: "jcl-over-slf4j" exclude group: "org.slf4j", module: "jcl-over-slf4j"
} }
implementation("org.assertj:assertj-core") implementation("org.assertj:assertj-core")
@@ -42,16 +42,13 @@ import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyRequest;
import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.resolution.DependencyResult;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; import org.eclipse.aether.supplier.RepositorySystemSupplier;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
@@ -242,41 +239,42 @@ final class ModifiedClassPathClassLoader extends URLClassLoader {
private static List<URL> resolveCoordinates(String[] coordinates) { private static List<URL> resolveCoordinates(String[] coordinates) {
Exception latestFailure = null; Exception latestFailure = null;
RepositorySystem repositorySystem = createRepositorySystem(); RepositorySystem repositorySystem = new RepositorySystemSupplier().get();
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); try {
session.setSystemProperties(System.getProperties()); DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepository = new LocalRepository(System.getProperty("user.home") + "/.m2/repository"); session.setSystemProperties(System.getProperties());
RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", LocalRepository localRepository = new LocalRepository(System.getProperty("user.home") + "/.m2/repository");
"https://repo.maven.apache.org/maven2") RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default",
.build(); "https://repo.maven.apache.org/maven2")
session.setLocalRepositoryManager(repositorySystem.newLocalRepositoryManager(session, localRepository)); .build();
for (int i = 0; i < MAX_RESOLUTION_ATTEMPTS; i++) { session.setLocalRepositoryManager(repositorySystem.newLocalRepositoryManager(session, localRepository));
CollectRequest collectRequest = new CollectRequest(null, Arrays.asList(remoteRepository)); for (int i = 0; i < MAX_RESOLUTION_ATTEMPTS; i++) {
collectRequest.setDependencies(createDependencies(coordinates)); CollectRequest collectRequest = new CollectRequest(null, Arrays.asList(remoteRepository));
DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null); collectRequest.setDependencies(createDependencies(coordinates));
try { DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null);
DependencyResult result = repositorySystem.resolveDependencies(session, dependencyRequest); try {
List<URL> resolvedArtifacts = new ArrayList<>(); DependencyResult result = repositorySystem.resolveDependencies(session, dependencyRequest);
for (ArtifactResult artifact : result.getArtifactResults()) { List<URL> resolvedArtifacts = new ArrayList<>();
resolvedArtifacts.add(artifact.getArtifact().getFile().toURI().toURL()); for (ArtifactResult artifact : result.getArtifactResults()) {
resolvedArtifacts.add(artifact.getArtifact().getFile().toURI().toURL());
}
return resolvedArtifacts;
} }
return resolvedArtifacts; catch (Exception ex) {
latestFailure = ex;
}
}
throw new IllegalStateException("Resolution failed after " + MAX_RESOLUTION_ATTEMPTS + " attempts",
latestFailure);
}
finally {
try {
repositorySystem.shutdown();
} }
catch (Exception ex) { catch (Exception ex) {
latestFailure = ex; // Ignore
} }
} }
throw new IllegalStateException("Resolution failed after " + MAX_RESOLUTION_ATTEMPTS + " attempts",
latestFailure);
}
@SuppressWarnings("deprecation")
private static RepositorySystem createRepositorySystem() {
org.eclipse.aether.impl.DefaultServiceLocator serviceLocator = MavenRepositorySystemUtils.newServiceLocator();
serviceLocator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
serviceLocator.addService(TransporterFactory.class, HttpTransporterFactory.class);
RepositorySystem repositorySystem = serviceLocator.getService(RepositorySystem.class);
return repositorySystem;
} }
private static List<Dependency> createDependencies(String[] allCoordinates) { private static List<Dependency> createDependencies(String[] allCoordinates) {