diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/utils/Maven3XProjectResolver.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/utils/Maven3XProjectResolver.java index 660f8367dfb5..d723151e7f34 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/utils/Maven3XProjectResolver.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/utils/Maven3XProjectResolver.java @@ -180,13 +180,11 @@ public class Maven3XProjectResolver { try { MavenSession mavenSession = myEmbedder.getComponent(LegacySupport.class).getSession(); RepositorySystemSession rawSession = myEmbedder.getComponent(LegacySupport.class).getRepositorySession(); - RepositorySystemSession repositorySession; - if (rawSession instanceof DefaultRepositorySystemSession) { - repositorySession = createRepositorySessionForMavenResolverV1((DefaultRepositorySystemSession)rawSession); - } - else { - repositorySession = createRepositorySessionForMavenResolverV2_x(request, rawSession); - } + // Maven resolver 2.x (e.g. Maven 3.10+) no longer exposes a DefaultRepositorySystemSession as the raw session. + boolean resolverV2 = !(rawSession instanceof DefaultRepositorySystemSession); + RepositorySystemSession repositorySession = resolverV2 + ? createRepositorySessionForMavenResolverV2_x(request, rawSession) + : createRepositorySessionForMavenResolverV1((DefaultRepositorySystemSession)rawSession); List buildingResults = myTelemetry.callWithSpan("getProjectBuildingResults " + files.size(), () -> getProjectBuildingResults(request, files)); @@ -247,7 +245,7 @@ public class Maven3XProjectResolver { if (myLongRunningTask.isCanceled()) return MavenServerExecutionResult.EMPTY; MavenServerExecutionResult result = myTelemetry.callWithSpan( "resolveBuildingResult " + br.projectId, () -> - resolveBuildingResult(repositorySession, addUnresolved, br.mavenProject, br.modelProblems, br.exceptions, + resolveBuildingResult(repositorySession, resolverV2, addUnresolved, br.mavenProject, br.modelProblems, br.exceptions, br.dependencyHash)); myLongRunningTask.incrementFinishedRequests(); return result; @@ -333,6 +331,7 @@ public class Maven3XProjectResolver { } private @NotNull MavenServerExecutionResult resolveBuildingResult(RepositorySystemSession repositorySession, + boolean resolverV2, boolean addUnresolved, MavenProject project, @NotNull List modelProblems, @@ -340,7 +339,11 @@ public class Maven3XProjectResolver { String dependencyHash) { try { DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession); - Set artifacts = resolveArtifacts(dependencyResolutionResult, addUnresolved); + // Maven resolver 2.x populates DependencyResolutionResult.getDependencies() differently, so the flat-list + BFS + // approach yields a wrong artifact order. Walk the dependency graph directly instead, same as the Maven 4 resolver. + Set artifacts = resolverV2 + ? resolveArtifactsFromDependencyGraph(dependencyResolutionResult) + : resolveArtifacts(dependencyResolutionResult, addUnresolved); project.setArtifacts(artifacts); return createExecutionResult(exceptions, modelProblems, project, dependencyResolutionResult, dependencyHash); @@ -641,6 +644,39 @@ public class Maven3XProjectResolver { return artifacts; } + /** + * Collects artifacts by a depth-first pre-order walk of the resolved dependency graph, skipping conflict losers. + * Mirrors {@code Maven40ProjectResolver.addArtifacts}; used for Maven resolver 2.x where the flat + * {@link DependencyResolutionResult#getDependencies()} list no longer yields the correct order. + */ + private @NotNull Set resolveArtifactsFromDependencyGraph(DependencyResolutionResult dependencyResolutionResult) { + Set artifacts = new LinkedHashSet<>(); + DependencyNode graph = dependencyResolutionResult.getDependencyGraph(); + if (graph == null || graph.getChildren() == null || graph.getChildren().isEmpty()) return artifacts; + addArtifactsFromGraph(artifacts, graph.getChildren()); + return artifacts; + } + + private void addArtifactsFromGraph(Set artifacts, List nodes) { + for (DependencyNode node : nodes) { + if (node.getData().get(ConflictResolver.NODE_DATA_WINNER) != null) { + continue; + } + Dependency dependency = node.getDependency(); + if (dependency == null) { + continue; + } + Artifact artifact = Maven3AetherModelConverter.toArtifact(dependency); + if (artifact == null) { + continue; + } + if (artifacts.add(artifact)) { + resolveAsModule(artifact); + } + addArtifactsFromGraph(artifacts, node.getChildren()); + } + } + private static void resolveConflicts(DependencyResolutionResult dependencyResolutionResult, Map winnerDependencyMap) { dependencyResolutionResult.getDependencyGraph().accept(new TreeDependencyVisitor(new DependencyVisitor() {