apache / apache/maven

[MNG-5960] MojoExecutor overriding resolved artifacts of concurrently built MavenProject

Open
#7,730 2 comments 0 reactions 0 assignees View on GitHub
bug priority:major
Dominant language
Java
Stars
5.3k
Forks
3.1k
Avg merge
20h 42m
Merged PRs (30d)
297

Description

**[Fabian van der Veen](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=yhn)** opened **[MNG-5960](https://issues.apache.org/jira/browse/MNG-5960?redirect=false)** and commented

I have found an issue with respect to the `MojoExecutor` in `maven-core` when building with multiple threads (e.g. `-T1C`).

I have created a small reproduction project here: https://github.com/fvanderveen/maven-mojo-jojo (in the readme is some more explanation of what I found to be the problem)

The reproduction, using the above code:
1. Clone this repository (`git clone https://github.com/fvanderveen/maven-mojo-jojo.git`)
2. Make sure the clone works single-threaded: `mvn clean package`. (This should succeed)
3. Clean the workspace (`mvn clean`)
4. Attempt multi-threaded compilation with at least 2 threads (`mvn package -T2`)

Boiled down, it seems like the `MojoExecutor#ensureDependenciesAreResolved` will cause an invocation to `LifecycleDependencyResolver#resolveProjectDependencies` for _all_ projects in the current `MavenSession` if it's configuring a plugin that defines `@Mojo(aggregator = true)` and `DependencyContext#isResolutionRequiredForAggregatedProjects` return true.

This resolving may, if triggered at an unfortunate time, override resolved artifacts for projects that are being built concurrently.

In our case, a `test-compile` execution of the `maven-compiler-plugin` was just configured (setting the resolved artifacts to the test-scope artifacts), and right before its execution, the resolved artifacts got set back to the compile-scope artifacts due to a aggregator plugin being configured at around the same time.

Given the way the `ensureDependenciesAreResolved` is structured and what aggregator plugins should do/depend on, I think it would make more sense to _only_ invoke `LifecycleDependencyResolver#resolveProjectDependencies` for the modules that are a (grand-)child of the current project.

I've created a maven extension (which can be placed in lib/ext) as a temporary workaround using said change; which may be found here if any one else is having the same problems: https://github.com/fvanderveen/maven-non-destructive-mojo-executor

---

**Affects:** 3.3.9, needing-scrub-3.4.0-fallout

**Issue Links:**
- [MNG-5750](https://issues.apache.org/jira/browse/MNG-5750) Sporadic failures in concurrent build

**Backported to:** waiting-for-feedback

1 votes, 9 watchers

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.