Uploaded image for project: 'Maven'
  1. Maven
  2. MNG-5960

MojoExecutor overriding resolved artifacts of concurrently built MavenProject

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 3.3.9, needing-scrub-3.4.0-fallout
    • Fix Version/s: 4.x / Backlog
    • Component/s: None
    • Labels:
      None
    • 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

      Description

      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

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                Yhn Fabian van der Veen
              • Votes:
                2 Vote for this issue
                Watchers:
                7 Start watching this issue

                Dates

                • Created:
                  Updated: