IDEA-391550: maven: dependencies order for maven 3.10.0 and resolver 2.x

(cherry picked from commit ae9680405704e68b37db25e2e2196c0feb1886a9)

IJ-CR-214363

GitOrigin-RevId: 22e25531d545e3d41cf21de558cf5807e2c076b2
This commit is contained in:
Alexander Bubenchikov
2026-07-21 16:39:32 +00:00
committed by intellij-monorepo-bot
parent fbd017478d
commit 377054509f
@@ -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<ProjectBuildingResult> 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<ModelProblem> modelProblems,
@@ -340,7 +339,11 @@ public class Maven3XProjectResolver {
String dependencyHash) {
try {
DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession);
Set<Artifact> 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<Artifact> 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<Artifact> resolveArtifactsFromDependencyGraph(DependencyResolutionResult dependencyResolutionResult) {
Set<Artifact> 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<Artifact> artifacts, List<DependencyNode> 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<Dependency, Artifact> winnerDependencyMap) {
dependencyResolutionResult.getDependencyGraph().accept(new TreeDependencyVisitor(new DependencyVisitor() {