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

Project which has shared dependency with a plugin fails to recognize artifact was downloaded and fails.

    XMLWordPrintableJSON

Details

    Description

      This is a twofer bug report

      Issue #1:

      I have included a stripped down version of an example using the maven antrun plugin to spawn the Antlr tool. For technical reasons we cannot use the native maven Antlr plugin.

      If you look at the attached project you will see that Antlr is a dependency of both the antrun plugin:

      ...
      <build>
        <plugins>		
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
              <dependencies>				
                <dependency>
                <groupId>org.antlr</groupId>
                <artifactId>antlr</artifactId>
                <version>${antlr.version}</version>
              </dependency>					
      ...
      

      And the project itself:

      ...
      
      <dependencies>
        <dependency>
          <groupId>org.antlr</groupId>
          <artifactId>antlr</artifactId>
         </dependency>
      </dependencies>
      
      ...
      
      

      Starting with a blank M2 local repo, and then running

      $ mvn -e -X -U clean install -s settings.xml > /tmp/maven.log

      Results in failure:

      Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact org.antlr:antlr:jar:3.4

      However this artifact was indeed downloaded (first as a project dependency). I stepped through some of the Maven code and it appears to fail during the second run through org.sonatype.aether.impl.internal.DefaultArtifactResolver#resolve as a plugin dependency.

      I strongly suspect it has to do with how org.sonatype.aether.impl.internal.EnhancedLocalRepositoryManager#find is implemented. It sees the file but it is not being tracked correctly I believe so it ignores it.

      If you run the build a second time it will then succeed because the Antlr artifacts will be available as they are in the local repo from the previous run.

      $ mvn -e -X -U clean install -s settings.xml > /tmp/maven2.log

      I observed the exact same problem when using the Maven enforcer plugin along with TestNG as they both depend on beanshell and with the Maven GWT plugin and GWT project dependencies.

      This was discovered as an issue once we started clearing out our local repo. Once the artifacts are populated locally the issue goes away. It takes a couple of runs to get past the bogus "missing artifact" errors but after that it is ok. It's difficult to predict when it will fail w/o being intimately familiar with all plugin/project dependencies per project.

      I noticed that having Antlr 3.0.4 only as plugin dependency works fine. It also works fine if it's only a project dependency. It's the combination of having it both as a plugin AND a project dependency causes this problem.

      #2

      My first thought to get around issue #1 was to use dependency:resolve as a pre-build step after cleaning the local repo but that doesn't full solve the problem.

      Using the Mavan dependency:resolve and dependency:resolve-plugins goals partially sidesteps issue #1 but it still gets confused about inter-module dependencies.

      For example I have a simple multi-module project that includes: foo-module, bar-module, and baz-module (see simple.zip).

      Running:

      $ mvn dependency:resolve dependency:resolve-plugins -s settings.xml

      Results in a build failure on the baz-module:

      [INFO] acme-pom .......................................... SUCCESS [6.835s]
      [INFO] foo-module ........................................ SUCCESS [1.327s]
      [INFO] bar-module ........................................ SUCCESS [0.090s]
      [INFO] baz-module ........................................ FAILURE [0.012s]

      This seems to avoid issue #1 as it doesn't complain about missing Antlr artifacts anymore but it gets stuck on the baz-module with the error:

      [ERROR] Failed to execute goal on project baz-module: Could not resolve dependencies for project com.acme:baz-module:jar:4.0.0-SNAPSHOT: The following artifacts could not be resolved: com.acme:foo-module:jar:4.0.0-SNAPSHOT, com.acme:bar-module:jar:4.0.0-SNAPSHOT: Could not find artifact com.acme:foo-module:jar:4.0.0-SNAPSHOT -> [Help 1]

      In our real projects there are many more modules which don't get resolved after this first failure so the local repo becomes only partially populated.

      Attachments

        1. pom.xml
          10 kB
          Kirk Rasmussen
        2. settings.xml
          1 kB
          Kirk Rasmussen
        3. maven.log
          130 kB
          Kirk Rasmussen
        4. maven2.log
          247 kB
          Kirk Rasmussen
        5. simple.zip
          7 kB
          Kirk Rasmussen
        6. a.3
          36 kB
          Michael Zav'yalov

        Activity

          People

            Unassigned Unassigned
            krasmussen Kirk Rasmussen
            Votes:
            1 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: