Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,21 @@ public BuildPlan buildInitialPlan(List<TaskSegment> taskSegments) {
Stream.of(pplan, setup, teardown).forEach(step -> plan.addStep(project, step.name, step));
}

// Handle reactor plugins: if a project uses a plugin that is also a reactor module,
// the project's PLAN step must wait for the plugin project's READY step.
// This must be done after PLAN/READY steps are created above.
Map<String, MavenProject> reactorGavs =
plan.getAllProjects().keySet().stream().collect(Collectors.toMap(BuildPlanExecutor::gav, p -> p));
for (MavenProject project : plan.getAllProjects().keySet()) {
for (Plugin plugin : project.getBuild().getPlugins()) {
MavenProject pluginProject = reactorGavs.get(gav(plugin));
if (pluginProject != null) {
plan.step(project, PLAN)
.ifPresent(pp -> plan.step(pluginProject, READY).ifPresent(pp::executeAfter));
}
}
}

return plan;
}

Expand Down Expand Up @@ -966,23 +981,15 @@ public BuildPlan calculateLifecycleMappings(
});
});

// Keep projects in reactors by GAV
// Eagerly resolve all non-reactor plugins in parallel
Map<String, MavenProject> reactorGavs =
projects.keySet().stream().collect(Collectors.toMap(BuildPlanExecutor::gav, p -> p));

// Go through all plugins
List<Runnable> toResolve = new ArrayList<>();
projects.keySet().forEach(project -> project.getBuild().getPlugins().forEach(plugin -> {
MavenProject pluginProject = reactorGavs.get(gav(plugin));
if (pluginProject != null) {
// In order to plan the project, we need all its plugins...
plan.requiredStep(project, PLAN).executeAfter(plan.requiredStep(pluginProject, READY));
} else {
if (reactorGavs.get(gav(plugin)) == null) {
toResolve.add(() -> resolvePlugin(session, project.getRemotePluginRepositories(), plugin));
}
}));

// Eagerly resolve all plugins in parallel
toResolve.parallelStream().forEach(Runnable::run);

// Keep track of phase aliases
Expand Down