From 57acdd41b46dbf7ed4a762643d5705c0acc8af2d Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Wed, 8 Mar 2023 09:03:33 +0100 Subject: [PATCH] [MNG-7720] Wrong build order of forked projects (#1038) The original fix MNG-7672 matched the "scope" but missed the "order". `project.collectedProjects` are in order as loaded (POM order), is not topologically sorted. Fix is to use DAG of projects, ask for downstream projects (will return more then we need but sorted) and narrow that list to only contain collected projects. Related commit: 48cac1c003fdc409e8c455c21fcba07050393b0c --- https://issues.apache.org/jira/browse/MNG-7720 --- .../internal/LifecycleDependencyResolver.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java index 699d70477e84..973b798c61f4 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java @@ -90,7 +90,11 @@ public LifecycleDependencyResolver(ProjectDependenciesResolver projectDependenci public static List getProjects(MavenProject project, MavenSession session, boolean aggregator) { if (aggregator && project.getCollectedProjects() != null) { - return getProjectAndSubModules(project).collect(Collectors.toList()); + List projectAndSubmodules = + getProjectAndSubModules(project).collect(Collectors.toList()); // not sorted but what we need + return session.getProjects().stream() // sorted all + .filter(projectAndSubmodules::contains) + .collect(Collectors.toList()); // sorted and filtered to what we need } else { return Collections.singletonList(project); } @@ -99,7 +103,10 @@ public static List getProjects(MavenProject project, MavenSession private static Stream getProjectAndSubModules(MavenProject project) { return Stream.concat( Stream.of(project), - project.getCollectedProjects().stream().flatMap(LifecycleDependencyResolver::getProjectAndSubModules)); + project.getCollectedProjects() == null + ? Stream.empty() + : project.getCollectedProjects().stream() + .flatMap(LifecycleDependencyResolver::getProjectAndSubModules)); } public void resolveProjectDependencies(