You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Michael Osipov (Jira)" <ji...@apache.org> on 2022/05/05 18:13:00 UTC

[jira] [Closed] (MRESOLVER-256) Dependency tree is different between DF and BF strategies when a dependency package has no indirect dependencies

     [ https://issues.apache.org/jira/browse/MRESOLVER-256?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Michael Osipov closed MRESOLVER-256.
------------------------------------
    Resolution: Fixed

Fixed with [2ea36519a72079b9efa59c6278b15bfb01a53fb4|https://gitbox.apache.org/repos/asf?p=maven-resolver.git&a=commit&h=2ea36519a72079b9efa59c6278b15bfb01a53fb4].

> Dependency tree is different between DF and BF strategies when a dependency package has no indirect dependencies
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: MRESOLVER-256
>                 URL: https://issues.apache.org/jira/browse/MRESOLVER-256
>             Project: Maven Resolver
>          Issue Type: Bug
>          Components: Resolver
>    Affects Versions: 1.8.0
>            Reporter: Michael Osipov
>            Assignee: Michael Osipov
>            Priority: Major
>             Fix For: 1.8.1
>
>
> From GitHub:
> Fix the problem that the dependency tree is different when DF and BF strategies are adopted when a dependency package has no children dependency.
> When BF is adopted, when a dependent package has no children dependency, it will not continue to call the doRecurse() method, that is, it will not call the CacheManager.cachewinner() to put this dependency package into the winnerGAs object, which affects the analysis results of dependency packages of the same GA. The current fix is to call the CacheManager.cachewinner() method when a dependent package has no children dependency and it is not skip resolution, so that the dependent package can be found in winnerGAs.
> We take the dependency in the following figure as an example to illustrate the generation process of the problem.
> <img width="359" alt="image" src="https://user-images.githubusercontent.com/104960983/166911972-6d721f62-ea17-46fc-af60-181aa5fdb041.png">
> At org eclipse. aether. internal. impl. Bfdependencycollector #collectdependencies() mainly has two stages: processdependency() and transformer.transformGraph( node, context )。
> In the first stage of process dependency:
> 1. When parsing to D1, descriptorResult.getDependencies().isEmpty(), so doRecurse() will not be executed. Therefore, args.skipper.cache() will not be executed. The D1 will not exist in winnerGAs in the end.
> ![image](https://user-images.githubusercontent.com/104960983/166884243-317a53ec-f26d-4bc2-96d0-1c6bf4053d76.png)
> 2. When parsing D2 of the same layer, because there is no same GA in winnerGAs, D2 and its children dependencies ( G1 and H1) will be parsed.
> 3. When resolving to G2 on the same layer as G1, because winnerGAs already has G1, the resolution of the children dependencies of G2 will be skipped, that is, H2 will not be resolved.
> Then, to the second stage, transformgraph:
> 4. Because D1 has the same depth as D2, D1 wins, that is, D2 and its children are eliminated, including G1
> 5. Because G1 was eliminated, G2 won.
> Finally, the final dependency tree obtained by BF strategy is as follows:
> <img width="272" alt="image" src="https://user-images.githubusercontent.com/104960983/166912027-21d7fcd4-79bd-43cc-80c8-0088091a91ef.png">
> But the dependency tree obtained by DF is as follows:
> <img width="296" alt="image" src="https://user-images.githubusercontent.com/104960983/166912045-2cff5bd6-f54d-4faa-a955-6c985923058a.png">
> That is, in the final generated dependency tree, BF has less children dependency of G2 than DF.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)