[ 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)