[
https://issues.apache.org/jira/browse/MNG-5988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15354679#comment-15354679
]
Jostein Gogstad commented on MNG-5988:
--------------------------------------
That's true, explicitly depending on some transitive dependency some library
needs will force maven to use that version. It's the easiest solution, but the
problem is unexpected and it is some times difficult to detect which library to
depend on.
When a test-scoped dependency requires a _different_ (not necessarily newer)
version of a library at shallow depth, maven has two choices:
# Package the test-scoped version, strictly adhering to nearest-definition and
possibly downgrading the library that production code requires.
# Package the compile/runtime scoped version, possibly downgrading the library
that test code requires
Alternative 2 is the better option of these choices because errors as a result
of conflicting dependencies are detected earlier and they don't affect
production code. CI being fairly common among development teams these days will
catch errors resulting from choosing the "wrong" library when the tests are
run. On the other hand, it the tests gets to dictate which library are chosen,
errors aren't visible until the application is run. Even though the transitive
dependencies are compile scoped, it won't matter since the direct dependency is
already compiled.
Maven should use "nearest definition" when choosing dependencies, but it
consider the scope of the direct dependency when doing so.
> Dependency mediation should prioritize transitive dependencies based on scope.
> ------------------------------------------------------------------------------
>
> Key: MNG-5988
> URL: https://issues.apache.org/jira/browse/MNG-5988
> Project: Maven
> Issue Type: Bug
> Components: Dependencies
> Affects Versions: 3.2.3
> Reporter: Jostein Gogstad
>
> The
> [documentation|https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html]
> states that dependency mediation only supports "nearest definition",
> regardless of the scope of the parent dependency.
> If both compile- and test scoped dependencies shares the same transitive
> dependency, the test-scoped one will win if it has shallower depth. That in
> turn will lead to runtime exceptions since the transitive dependency is no
> longer on the classpath.
> Take the following pom from a typical [Spring
> Boot|http://projects.spring.io/spring-boot/] application. Since the
> {{camel-test-spring}} dependency also depends on spring, it wins and Spring
> is no longer available to the application at runtime.
> {code:xml}
> <project xmlns="http://maven.apache.org/POM/4.0.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/maven-v4_0_0.xsd">
> <modelVersion>4.0.0</modelVersion>
> <groupId>com.example</groupId>
> <artifactId>bugreport</artifactId>
> <packaging>jar</packaging>
> <version>1.0.0-SNAPSHOT</version>
> <dependencies>
> <dependency>
> <groupId>org.springframework.boot</groupId>
> <artifactId>spring-boot-starter-web</artifactId>
> <version>1.3.2.RELEASE</version>
> </dependency>
> <dependency>
> <groupId>org.apache.camel</groupId>
> <artifactId>camel-test-spring</artifactId>
> <version>2.16.2</version>
> <scope>test</scope>
> </dependency>
> </dependencies>
> </project>
> {code}
> Now look for {{spring-beans}} or {{spring-context}} in the following
> dependency graphs:
> {code:xml|title=mvn dependency:tree (with camel-test-spring)}
> [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ bugreport ---
> [INFO] com.example:bugreport:jar:1.0.0-SNAPSHOT
> [INFO] +-
> org.springframework.boot:spring-boot-starter-web:jar:1.3.2.RELEASE:compile
> [INFO] | +-
> org.springframework.boot:spring-boot-starter:jar:1.3.2.RELEASE:compile
> [INFO] | | +- org.springframework.boot:spring-boot:jar:1.3.2.RELEASE:compile
> [INFO] | | +-
> org.springframework.boot:spring-boot-autoconfigure:jar:1.3.2.RELEASE:compile
> [INFO] | | +-
> org.springframework.boot:spring-boot-starter-logging:jar:1.3.2.RELEASE:compile
> [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.3:compile
> [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.3:compile
> [INFO] | | | +- org.slf4j:jcl-over-slf4j:jar:1.7.13:compile
> [INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.13:compile
> [INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.13:compile
> [INFO] | | \- org.yaml:snakeyaml:jar:1.16:runtime
> [INFO] | +-
> org.springframework.boot:spring-boot-starter-tomcat:jar:1.3.2.RELEASE:compile
> [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.0.30:compile
> [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.0.30:compile
> [INFO] | | +-
> org.apache.tomcat.embed:tomcat-embed-logging-juli:jar:8.0.30:compile
> [INFO] | | \-
> org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.0.30:compile
> [INFO] | +-
> org.springframework.boot:spring-boot-starter-validation:jar:1.3.2.RELEASE:compile
> [INFO] | | \- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile
> [INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile
> [INFO] | | +- org.jboss.logging:jboss-logging:jar:3.2.1.Final:compile
> [INFO] | | \- com.fasterxml:classmate:jar:1.1.0:compile
> [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.6.5:compile
> [INFO] | | +-
> com.fasterxml.jackson.core:jackson-annotations:jar:2.6.0:compile
> [INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.6.5:compile
> [INFO] | +- org.springframework:spring-web:jar:4.2.4.RELEASE:compile
> [INFO] | \- org.springframework:spring-webmvc:jar:4.2.4.RELEASE:compile
> [INFO] \- org.apache.camel:camel-test-spring:jar:2.16.2:test
> [INFO] +- org.apache.camel:camel-test:jar:2.16.2:test
> [INFO] | +- org.apache.camel:camel-core:jar:2.16.2:test
> [INFO] | | \- org.slf4j:slf4j-api:jar:1.6.6:compile
> [INFO] | \- junit:junit:jar:4.11:test
> [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
> [INFO] +- org.apache.camel:camel-spring:jar:2.16.2:test
> [INFO] +- org.springframework:spring-test:jar:4.1.9.RELEASE:test
> [INFO] +- org.springframework:spring-context:jar:4.1.9.RELEASE:compile
> [INFO] +- org.springframework:spring-beans:jar:4.1.9.RELEASE:compile
> [INFO] +- org.springframework:spring-expression:jar:4.1.9.RELEASE:compile
> [INFO] +- org.springframework:spring-aop:jar:4.1.9.RELEASE:compile
> [INFO] | \- aopalliance:aopalliance:jar:1.0:compile
> [INFO] +- org.springframework:spring-tx:jar:4.1.9.RELEASE:test
> [INFO] +- org.springframework:spring-core:jar:4.1.9.RELEASE:compile
> [INFO] | \- commons-logging:commons-logging:jar:1.2:compile
> [INFO] +- com.sun.xml.bind:jaxb-core:jar:2.2.11:test
> [INFO] \- com.sun.xml.bind:jaxb-impl:jar:2.2.11:test
> {code}
> {code:xml|title=mvn dependency:tree (without camel-test-spring)}
> [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ bugreport ---
> [INFO] com.example:bugreport:jar:1.0.0-SNAPSHOT
> [INFO] \-
> org.springframework.boot:spring-boot-starter-web:jar:1.3.2.RELEASE:compile
> [INFO] +-
> org.springframework.boot:spring-boot-starter:jar:1.3.2.RELEASE:compile
> [INFO] | +- org.springframework.boot:spring-boot:jar:1.3.2.RELEASE:compile
> [INFO] | +-
> org.springframework.boot:spring-boot-autoconfigure:jar:1.3.2.RELEASE:compile
> [INFO] | +-
> org.springframework.boot:spring-boot-starter-logging:jar:1.3.2.RELEASE:compile
> [INFO] | | +- ch.qos.logback:logback-classic:jar:1.1.3:compile
> [INFO] | | | +- ch.qos.logback:logback-core:jar:1.1.3:compile
> [INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.7:compile
> [INFO] | | +- org.slf4j:jcl-over-slf4j:jar:1.7.13:compile
> [INFO] | | +- org.slf4j:jul-to-slf4j:jar:1.7.13:compile
> [INFO] | | \- org.slf4j:log4j-over-slf4j:jar:1.7.13:compile
> [INFO] | +- org.springframework:spring-core:jar:4.2.4.RELEASE:compile
> [INFO] | \- org.yaml:snakeyaml:jar:1.16:runtime
> [INFO] +-
> org.springframework.boot:spring-boot-starter-tomcat:jar:1.3.2.RELEASE:compile
> [INFO] | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.0.30:compile
> [INFO] | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.0.30:compile
> [INFO] | +-
> org.apache.tomcat.embed:tomcat-embed-logging-juli:jar:8.0.30:compile
> [INFO] | \-
> org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.0.30:compile
> [INFO] +-
> org.springframework.boot:spring-boot-starter-validation:jar:1.3.2.RELEASE:compile
> [INFO] | \- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile
> [INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile
> [INFO] | +- org.jboss.logging:jboss-logging:jar:3.2.1.Final:compile
> [INFO] | \- com.fasterxml:classmate:jar:1.1.0:compile
> [INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.6.5:compile
> [INFO] | +-
> com.fasterxml.jackson.core:jackson-annotations:jar:2.6.0:compile
> [INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.6.5:compile
> [INFO] +- org.springframework:spring-web:jar:4.2.4.RELEASE:compile
> [INFO] | +- org.springframework:spring-aop:jar:4.2.4.RELEASE:compile
> [INFO] | | \- aopalliance:aopalliance:jar:1.0:compile
> [INFO] | +- org.springframework:spring-beans:jar:4.2.4.RELEASE:compile
> [INFO] | \- org.springframework:spring-context:jar:4.2.4.RELEASE:compile
> [INFO] \- org.springframework:spring-webmvc:jar:4.2.4.RELEASE:compile
> [INFO] \-
> org.springframework:spring-expression:jar:4.2.4.RELEASE:compile
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)