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

Adding a test dependency can move dependencies from the compile scope to the test scope

    XMLWordPrintableJSON

Details

    Description

      I'm seeing some strange behaviour where the transitive dependencies of a test-scope dependency are causing transitive dependencies of a compile-scope dependency to become test-scoped.

      A pom with a single dependency on org.eclipse.jetty:jetty-webapp produces the following dependencies:

      $ mvn dependency:tree | grep org.eclipse.jetty:
      [INFO] \- org.eclipse.jetty:jetty-webapp:jar:8.1.10.v20130312:compile
      [INFO]    +- org.eclipse.jetty:jetty-xml:jar:8.1.10.v20130312:compile
      [INFO]    |  \- org.eclipse.jetty:jetty-util:jar:8.1.10.v20130312:compile
      [INFO]    \- org.eclipse.jetty:jetty-servlet:jar:8.1.10.v20130312:compile
      [INFO]       \- org.eclipse.jetty:jetty-security:jar:8.1.10.v20130312:compile
      [INFO]          \- org.eclipse.jetty:jetty-server:jar:8.1.10.v20130312:compile
      [INFO]             +- org.eclipse.jetty:jetty-continuation:jar:8.1.10.v20130312:compile
      [INFO]             \- org.eclipse.jetty:jetty-http:jar:8.1.10.v20130312:compile
      [INFO]                \- org.eclipse.jetty:jetty-io:jar:8.1.10.v20130312:compile
      

      If I now add a test dependency on org.apache.solr:sole-core, a number of dependencies that were previously in the compile scope are now in the test scope:

      $ mvn dependency:tree | grep org.eclipse.jetty:
      [INFO] +- org.eclipse.jetty:jetty-webapp:jar:8.1.10.v20130312:compile
      [INFO] |  +- org.eclipse.jetty:jetty-xml:jar:8.1.10.v20130312:compile
      [INFO] |  \- org.eclipse.jetty:jetty-servlet:jar:8.1.10.v20130312:compile
      [INFO]    +- org.eclipse.jetty:jetty-continuation:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-deploy:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-http:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-io:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-jmx:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-security:jar:8.1.10.v20130312:compile
      [INFO]    +- org.eclipse.jetty:jetty-server:jar:8.1.10.v20130312:test
      [INFO]    +- org.eclipse.jetty:jetty-util:jar:8.1.10.v20130312:compile
      

      My understanding is that this is because the shortest route to the root of the hierarchy wins and, for a number of the Jetty dependencies, the shortest route is via the test-scoped org.apache.solr:sole-core. I can understand a test-scoped dependency being upgraded to the compile scope when a dependency is added, but downgrading a dependency from the compile scope to the test scope feels broken to me.

      I can work around the problem by using dependency management to force the dependencies into the compile scope, or by declaring direct dependencies on the transitive dependencies of org.eclipse.jetty:jetty-webapp, but both approaches require me to know what all those dependencies are and "duplicate" them in my pom, undermining the value of the dependencies being pulled in transitively in the first place.

      Attachments

        1. pom.xml
          1.0 kB
          sni
        2. test-scope-problem.zip
          2 kB

        Issue Links

          Activity

            People

              Unassigned Unassigned
              awilkinson Andy Wilkinson
              Votes:
              7 Vote for this issue
              Watchers:
              15 Start watching this issue

              Dates

                Created:
                Updated: