mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
committed by
intellij-monorepo-bot
parent
fbd017478d
commit
377054509f
+45
-9
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user