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

Tomo Suzuki edited comment on MNG-6357 at 4/23/19 8:58 PM:
-----------------------------------------------------------

I encountered this issue today. I had an assumption that Maven exec plugin 
builds a class path in "nearest first" manner, but it actually treats it in 
"depth first" manner.

Code to reproduce: [https://github.com/suztomo/triangle-linkage-error] .

Given this tree of transitive dependencies Artifact 1 - 5.

{{ suztomo:main:jar:0.0.1-SNAPSHOT}}
 {{ +- suztomo:artifact1}}
 {{ |  +- suztomo:artifact4}}
 {{ +- suztomo:artifact2}}
 {{ |  +- suztomo:artifact5}}
 {{ +- suztomo:artifact3}} 

I expected Maven exec plugin to build a class path of "artifact1, artifact2, 
artifact3, artifact4, artifact5". However it builds a class path of "artifact1, 
artifact*4*, artifact2, artifact*5*, artifact3".

 

 

In Github discussion [https://github.com/mojohaus/exec-maven-plugin/issues/91], 
rfscholte wrote

_>Hervé confirmed that the "nearest wins" is only about version selection and 
not about dependency order. This order is simply done by tree-walking. However, 
we agreed that it would make sense to compile based on the direct dependencies 
first, followed by first level, second level, etc._ 

Thank you. I also think that's intuitive behavior, in line with Maven's 
dependency mediation algorithm.

 


was (Author: suztomo):
I encountered this issue today. I had an assumption that Maven exec plugin 
builds a class path in "nearest first" manner, but it actually treats it in 
"depth first" manner.

Code to reproduce: [https://github.com/suztomo/triangle-linkage-error] .

Given this tree of transitive dependencies Artifact 1 - 5.

{{ suztomo:main:jar:0.0.1-SNAPSHOT}}
 {{ +- suztomo:artifact1}}
 {{ | - suztomo:artifact4}}
 {{ +- suztomo:artifact2}}
 {{ | - suztomo:artifact5}}
 {{ +- suztomo:artifact3}} 

I expected Maven exec plugin to build a class path of "artifact1, artifact2, 
artifact3, artifact4, artifact5". However it builds a class path of "artifact1, 
artifact*4*, artifact2, artifact*5*, artifact3".

 

 

In Github discussion [https://github.com/mojohaus/exec-maven-plugin/issues/91], 
rfscholte wrote

_>Hervé confirmed that the "nearest wins" is only about version selection and 
not about dependency order. This order is simply done by tree-walking. However, 
we agreed that it would make sense to compile based on the direct dependencies 
first, followed by first level, second level, etc._ 

Thank you. I also think that's intuitive behavior, in line with Maven's 
dependency mediation algorithm.

 

> Dependency order should be nearest first 
> -----------------------------------------
>
>                 Key: MNG-6357
>                 URL: https://issues.apache.org/jira/browse/MNG-6357
>             Project: Maven
>          Issue Type: Improvement
>            Reporter: Robert Scholte
>            Priority: Major
>
> In case of version conflicts, the nearest wins. However, the dependency order 
> is simply based on tree walking. In the rare that a transitive dependency of 
> the first direct dependency contains the same class as a latter direct 
> dependency, the code is compiled against the first one, which is odd.
> It would make more sense if direct dependencies are the first ones on the 
> classpath, followed by the first level transitive dependencies, etc. This 
> will make the explanation equal to version conflict resolution: nearest wins.
> I don't expect real issues due to this change, otherwise we would have had 
> this issue much earlier. This should become the new default order, however 
> there should be a system property to get the original order, just in case 
> somebody needs it.
>  
> Current workaround: make the critical dependency the first direct dependency.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to