Fabian van der Veen created MNG-5960:
----------------------------------------

             Summary: MojoExecutor overriding resolved artifacts of 
concurrently built MavenProject
                 Key: MNG-5960
                 URL: https://issues.apache.org/jira/browse/MNG-5960
             Project: Maven
          Issue Type: Bug
    Affects Versions: 3.3.9, 3.4.0
         Environment: Linux 4.2.0-23-generic #28-Ubuntu SMP Sun Dec 27 17:47:31 
UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
(Ubuntu 15.10)
Maven 3.3.9/3.4.0-SNAPSHOT
            Reporter: Fabian van der Veen


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



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to