[ 
https://issues.apache.org/jira/browse/MNG-7906?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17812637#comment-17812637
 ] 

Tamas Cservenak commented on MNG-7906:
--------------------------------------

I have several issues with statements in previous post, but the major one is 
this: it references a plugin page that has following statement "Apache Maven 
operates under the assumption that every dependency is always backwards 
compatible and when two versions are compared, using the 'higher' version will 
satisfy any dependency". Am unsure from where [~henning] takes this to be 
granted, or even assumes this statement is true, as source code of resolver 
does NOT show this at all (or please point me to the code that implements this 
behaviour).

What I know, is that we most probably talk about "conflict resolution". The 
Javadoc of conflict resolver is here: 
[https://github.com/apache/maven-resolver/blob/master/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java#L37-L54]

It points us ("The exact rules by which a winning node and its effective scope 
are determined are controlled by user-supplied implementations of 
VersionSelector...") toward version selector: 
[https://github.com/apache/maven-resolver/blob/master/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java#L41-L42]

In short, the statement quoted does not stand at all ("operates under the 
assumption that every dependency is always backwards compatible and when two 
versions are compared, using the 'higher' version will satisfy any dependency") 
for Maven3. Someone very interested in this topic may do a homework, and dig 
into Maven2 source code and be surprised.

Maven will choose "nearest version" not "highest version". As graph root is 
level 0, is your POM or root dependency of graph being collected, each node has 
well defined distance from root: the length of the path you need to make to get 
from root to given node. And the most interesting thing: user DO have saying 
here, as direct dependencies on POM have distance 1, so they will always win. 
In other words, user CAN affect what is chosen for "winner".

> Dependency Management import does not work the "maven way"
> ----------------------------------------------------------
>
>                 Key: MNG-7906
>                 URL: https://issues.apache.org/jira/browse/MNG-7906
>             Project: Maven
>          Issue Type: Bug
>          Components: Dependencies, Documentation:  General
>            Reporter: Tamas Cservenak
>            Priority: Major
>             Fix For: 4.0.x-candidate
>
>
> This affects all released Maven versions so far.
> Problem reproducer: https://github.com/cstamas/MNG-7852 (repo name is wrong, 
> obviously).
> In short: unlike with dependencies, where you CAN override some "deep 
> transitive" dependency by re-declaring it directly as 1st level dependency in 
> POM, for depMgt import this does not work, actually, it works quite the 
> opposite ("first comes, wins"). Moreover, Maven remains silent about this, as 
> reproducer shows, and all of this goes unnoticed.
> Solution: at least depMgt import should make "the maven way", maybe not by 
> default (to not break existing builds) but configurable. Problem is solved if 
> in reproducer:
> - with fix enabled, junit 5.9.3 is used, AND
> - with fix disabled, Maven yells about ignored depMgt import



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to