apache / apache/maven

[MNG-5988] Dependency mediation should prioritize transitive dependencies based on scope.

Open
#7,842 17 comments 0 reactions 0 assignees View on GitHub
bug priority:major
Dominant language
Java
Stars
5.3k
Forks
3.1k
Avg merge
20h 42m
Merged PRs (30d)
297

Description

**[Jostein Gogstad](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=jgogstad)** opened **[MNG-5988](https://issues.apache.org/jira/browse/MNG-5988?redirect=false)** and commented

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.

```xml

4.0.0

com.example
bugreport
jar
1.0.0-SNAPSHOT



org.springframework.boot
spring-boot-starter-web
1.3.2.RELEASE


org.apache.camel
camel-test-spring
2.16.2
test

```

Now look for `spring-beans` or `spring-context` in the following dependency graphs:

```xml
[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
```

```xml
[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
```

---

**Affects:** 3.2.3

**Attachments:**
- [Collected.svg](https://issues.apache.org/jira/secure/attachment/12815724/Collected.svg) (_6.65 kB_)
- [MNG-5988.zip](https://issues.apache.org/jira/secure/attachment/12815711/MNG-5988.zip) (_3.38 kB_)
- [PRE.svg](https://issues.apache.org/jira/secure/attachment/12814785/PRE.svg) (_183.01 kB_)
- [Resolved.svg](https://issues.apache.org/jira/secure/attachment/12815725/Resolved.svg) (_5.85 kB_)

**Issue Links:**
- [MNG-6056](https://issues.apache.org/jira/browse/MNG-6056) Implement Feature Toggle Module to handle Feature Toggles
(_**"is blocked by"**_)
- [MNG-7852](https://issues.apache.org/jira/browse/MNG-7852) Use all the versions for dependency resolution rather than "nearest first" or "declared first"

- [MNG-6058](https://issues.apache.org/jira/browse/MNG-6058) Test dependencies should override application dependencies only during testing
(_**"is superceded by"**_)

**Remote Links:**
- [GitHub Pull Request #442
](https://github.com/apache/maven-dependency-plugin/pull/442)

4 votes, 12 watchers

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.