mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
IDEA-250744 aether-dependency-resolver downloads POMs of excluded dependencies
GitOrigin-RevId: 3d1c23e39d05c40f90bbb417086f5656d8b3a319
This commit is contained in:
committed by
intellij-monorepo-bot
parent
4c6287db0d
commit
70cfcc7e83
@@ -4,16 +4,14 @@ package org.jetbrains.idea.maven.aether;
|
||||
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
|
||||
import org.eclipse.aether.DefaultRepositorySystemSession;
|
||||
import org.eclipse.aether.RepositorySystem;
|
||||
import org.eclipse.aether.RepositorySystemSession;
|
||||
import org.eclipse.aether.artifact.Artifact;
|
||||
import org.eclipse.aether.artifact.DefaultArtifact;
|
||||
import org.eclipse.aether.collection.CollectRequest;
|
||||
import org.eclipse.aether.collection.CollectResult;
|
||||
import org.eclipse.aether.collection.DependencyCollectionException;
|
||||
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
|
||||
import org.eclipse.aether.graph.Dependency;
|
||||
import org.eclipse.aether.graph.DependencyFilter;
|
||||
import org.eclipse.aether.graph.DependencyNode;
|
||||
import org.eclipse.aether.graph.DependencyVisitor;
|
||||
import org.eclipse.aether.graph.*;
|
||||
import org.eclipse.aether.impl.DefaultServiceLocator;
|
||||
import org.eclipse.aether.repository.LocalRepository;
|
||||
import org.eclipse.aether.repository.RemoteRepository;
|
||||
@@ -29,6 +27,8 @@ import org.eclipse.aether.transport.http.HttpTransporterFactory;
|
||||
import org.eclipse.aether.util.artifact.DelegatingArtifact;
|
||||
import org.eclipse.aether.util.artifact.JavaScopes;
|
||||
import org.eclipse.aether.util.filter.DependencyFilterUtils;
|
||||
import org.eclipse.aether.util.graph.selector.AndDependencySelector;
|
||||
import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
|
||||
import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor;
|
||||
import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor;
|
||||
import org.eclipse.aether.util.version.GenericVersionScheme;
|
||||
@@ -40,6 +40,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
@@ -53,7 +54,7 @@ public final class ArtifactRepositoryManager {
|
||||
private static final VersionScheme ourVersioning = new GenericVersionScheme();
|
||||
private static final JreProxySelector ourProxySelector = new JreProxySelector();
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ArtifactRepositoryManager.class);
|
||||
private final DefaultRepositorySystemSession mySession;
|
||||
private final RepositorySystemSessionFactory sessionFactory;
|
||||
|
||||
private static final RemoteRepository MAVEN_CENTRAL_REPOSITORY = createRemoteRepository(
|
||||
"central", "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/"
|
||||
@@ -96,52 +97,94 @@ public final class ArtifactRepositoryManager {
|
||||
|
||||
public ArtifactRepositoryManager(@NotNull File localRepositoryPath, List<RemoteRepository> remoteRepositories, @NotNull ProgressConsumer progressConsumer, boolean offline) {
|
||||
myRemoteRepositories.addAll(remoteRepositories);
|
||||
final DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
|
||||
if (progressConsumer != ProgressConsumer.DEAF) {
|
||||
session.setTransferListener(new TransferListener() {
|
||||
@Override
|
||||
public void transferInitiated(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
sessionFactory = new RepositorySystemSessionFactory(localRepositoryPath, progressConsumer, offline);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferStarted(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
private static class RepositorySystemSessionFactory {
|
||||
private final RepositorySystemSession defaultSession;
|
||||
|
||||
@Override
|
||||
public void transferProgressed(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferCorrupted(TransferEvent event) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferSucceeded(TransferEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferFailed(TransferEvent event) {
|
||||
}
|
||||
|
||||
private void handle(TransferEvent event) throws TransferCancelledException {
|
||||
if (progressConsumer.isCanceled()) {
|
||||
throw new TransferCancelledException();
|
||||
RepositorySystemSessionFactory(@NotNull File localRepositoryPath,
|
||||
@NotNull ProgressConsumer progressConsumer,
|
||||
boolean offline) {
|
||||
final DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
|
||||
if (progressConsumer != ProgressConsumer.DEAF) {
|
||||
session.setTransferListener(new TransferListener() {
|
||||
@Override
|
||||
public void transferInitiated(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
progressConsumer.consume(event.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
// setup session here
|
||||
|
||||
session.setLocalRepositoryManager(ourSystem.newLocalRepositoryManager(session, new LocalRepository(localRepositoryPath)));
|
||||
session.setProxySelector(ourProxySelector);
|
||||
session.setOffline(offline);
|
||||
session.setReadOnly();
|
||||
mySession = session;
|
||||
@Override
|
||||
public void transferStarted(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferProgressed(TransferEvent event) throws TransferCancelledException {
|
||||
handle(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferCorrupted(TransferEvent event) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferSucceeded(TransferEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transferFailed(TransferEvent event) {
|
||||
}
|
||||
|
||||
private void handle(TransferEvent event) throws TransferCancelledException {
|
||||
if (progressConsumer.isCanceled()) {
|
||||
throw new TransferCancelledException();
|
||||
}
|
||||
progressConsumer.consume(event.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
// setup session here
|
||||
|
||||
session.setLocalRepositoryManager(ourSystem.newLocalRepositoryManager(session, new LocalRepository(localRepositoryPath)));
|
||||
session.setProxySelector(ourProxySelector);
|
||||
session.setOffline(offline);
|
||||
session.setReadOnly();
|
||||
this.defaultSession = session;
|
||||
}
|
||||
|
||||
RepositorySystemSession session() {
|
||||
return session(Collections.emptyList());
|
||||
}
|
||||
|
||||
RepositorySystemSession session(@NotNull List<String> excludedDependencies) {
|
||||
if (excludedDependencies.isEmpty()) {
|
||||
return defaultSession;
|
||||
}
|
||||
else {
|
||||
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(defaultSession);
|
||||
session.setDependencySelector(new AndDependencySelector(
|
||||
session.getDependencySelector(),
|
||||
new ExclusionDependencySelector(exclusions(excludedDependencies)))
|
||||
);
|
||||
session.setReadOnly();
|
||||
return session;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("SSBasedInspection")
|
||||
private static List<Exclusion> exclusions(List<String> excludedDependencies) {
|
||||
return excludedDependencies.stream().map(exclusion -> {
|
||||
String[] split = exclusion.split(":", 2);
|
||||
if (split.length != 2) {
|
||||
throw new RuntimeException("Malformed exclusion, 'groupId:artifactName' format is expected but got " + exclusion);
|
||||
}
|
||||
String groupId = split[0];
|
||||
String artifactName = split[1];
|
||||
return new Exclusion(groupId, artifactName, "*", "*");
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -199,7 +242,7 @@ public final class ArtifactRepositoryManager {
|
||||
Set<VersionConstraint> constraints = Collections.singleton(asVersionConstraint(versionConstraint));
|
||||
CollectRequest collectRequest = createCollectRequest(groupId, artifactId, constraints, EnumSet.of(ArtifactKind.ARTIFACT));
|
||||
ArtifactDependencyTreeBuilder builder = new ArtifactDependencyTreeBuilder();
|
||||
DependencyNode root = ourSystem.collectDependencies(mySession, collectRequest).getRoot();
|
||||
DependencyNode root = ourSystem.collectDependencies(sessionFactory.session(), collectRequest).getRoot();
|
||||
if (root.getArtifact() == null && root.getChildren().size() == 1) {
|
||||
root = root.getChildren().get(0);
|
||||
}
|
||||
@@ -224,9 +267,11 @@ public final class ArtifactRepositoryManager {
|
||||
} else {
|
||||
constraints = Collections.singleton(originalConstraints);
|
||||
}
|
||||
RepositorySystemSession session;
|
||||
if (includeTransitiveDependencies) {
|
||||
session = sessionFactory.session(excludedDependencies);
|
||||
final CollectResult collectResult = ourSystem.collectDependencies(
|
||||
mySession, createCollectRequest(groupId, artifactId, constraints, EnumSet.of(kind))
|
||||
session, createCollectRequest(groupId, artifactId, constraints, EnumSet.of(kind))
|
||||
);
|
||||
final ArtifactRequestBuilder builder = new ArtifactRequestBuilder(kind);
|
||||
DependencyFilter filter = createScopeFilter();
|
||||
@@ -237,11 +282,12 @@ public final class ArtifactRepositoryManager {
|
||||
requests = builder.getRequests();
|
||||
}
|
||||
else {
|
||||
session = sessionFactory.session();
|
||||
requests = new ArrayList<>();
|
||||
for (Artifact artifact : toArtifacts(groupId, artifactId, constraints, Collections.singleton(kind))) {
|
||||
if (ourVersioning.parseVersionConstraint(artifact.getVersion()).getRange() != null) {
|
||||
final VersionRangeRequest versionRangeRequest = new VersionRangeRequest(artifact, Collections.unmodifiableList(myRemoteRepositories), null);
|
||||
final VersionRangeResult result = ourSystem.resolveVersionRange(mySession, versionRangeRequest);
|
||||
final VersionRangeResult result = ourSystem.resolveVersionRange(session, versionRangeRequest);
|
||||
if (!result.getVersions().isEmpty()) {
|
||||
Artifact newArtifact = artifact.setVersion(result.getHighestVersion().toString());
|
||||
requests.add(new ArtifactRequest(newArtifact, Collections.unmodifiableList(myRemoteRepositories), null));
|
||||
@@ -255,7 +301,7 @@ public final class ArtifactRepositoryManager {
|
||||
|
||||
if (!requests.isEmpty()) {
|
||||
try {
|
||||
for (ArtifactResult result : ourSystem.resolveArtifacts(mySession, requests)) {
|
||||
for (ArtifactResult result : ourSystem.resolveArtifacts(session, requests)) {
|
||||
artifacts.add(result.getArtifact());
|
||||
}
|
||||
}
|
||||
@@ -265,7 +311,7 @@ public final class ArtifactRepositoryManager {
|
||||
if (requests.size() > 1) {
|
||||
for (ArtifactRequest request : requests) {
|
||||
try {
|
||||
final ArtifactResult result = ourSystem.resolveArtifact(mySession, request);
|
||||
final ArtifactResult result = ourSystem.resolveArtifact(session, request);
|
||||
artifacts.add(result.getArtifact());
|
||||
}
|
||||
catch (ArtifactResolutionException ignored) {
|
||||
@@ -343,7 +389,7 @@ public final class ArtifactRepositoryManager {
|
||||
@NotNull
|
||||
public List<Version> getAvailableVersions(String groupId, String artifactId, String versionConstraint, final ArtifactKind artifactKind) throws Exception {
|
||||
final VersionRangeResult result = ourSystem.resolveVersionRange(
|
||||
mySession, createVersionRangeRequest(groupId, artifactId, asVersionConstraint(versionConstraint), artifactKind)
|
||||
sessionFactory.session(), createVersionRangeRequest(groupId, artifactId, asVersionConstraint(versionConstraint), artifactKind)
|
||||
);
|
||||
return result.getVersions();
|
||||
}
|
||||
|
||||
@@ -99,6 +99,20 @@ public class ArtifactRepositoryManagerTest extends UsefulTestCase {
|
||||
assertCoordinates(first.getDependencies().get(1).getArtifact(), "commons-codec", "commons-codec", "1.10");
|
||||
}
|
||||
|
||||
public void testTransitiveSnapshotDependenciesExcluded() throws Exception {
|
||||
// version of this excluded dependency is [0.8.1,)
|
||||
String excludedArtifact = "sshj";
|
||||
List<String> excluded = Collections.singletonList("net.schmizz:" + excludedArtifact);
|
||||
myRepositoryManager.resolveDependency("com.jcraft", "jsch.agentproxy.sshj", "0.0.9", true, excluded);
|
||||
try (Stream<Path> files = Files.walk(localRepository.toPath())) {
|
||||
assertEmpty(files.filter(file -> {
|
||||
String fileName = file.getFileName().toString();
|
||||
return fileName.startsWith(excludedArtifact + "-") &&
|
||||
(fileName.endsWith(".pom") || fileName.endsWith(".jar"));
|
||||
}).collect(Collectors.toList()));
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertCoordinates(Artifact artifact, String groupId, String artifactId, String version) {
|
||||
assertEquals(groupId, artifact.getGroupId());
|
||||
assertEquals(artifactId, artifact.getArtifactId());
|
||||
|
||||
Reference in New Issue
Block a user