Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动获取maven中最新的可传递依赖项_Maven_Transitive Dependency - Fatal编程技术网

自动获取maven中最新的可传递依赖项

自动获取maven中最新的可传递依赖项,maven,transitive-dependency,Maven,Transitive Dependency,考虑一种非常常见的情况,当一个项目依赖于两个库时,每个库都会过渡地带来不同版本的第三个库: Project A: Library B: Library D: version 1 Library C: Library D: version 2 我可以使用来检测此类问题,然后在项目A的pom中直接指定库D的版本,例如,在第节中 但这会产生另一个问题:现在我必须手动跟踪库D的版本,即使我的项目没有直接使用它 每当我更改库B或库C的版本时,我必须记住在我

考虑一种非常常见的情况,当一个项目依赖于两个库时,每个库都会过渡地带来不同版本的第三个库:

Project A:
    Library B:
        Library D: version 1
    Library C:
        Library D: version 2
我可以使用来检测此类问题,然后在项目A的pom中直接指定库D的版本,例如,在第节中

但这会产生另一个问题:现在我必须手动跟踪库D的版本,即使我的项目没有直接使用它
每当我更改库B或库C的版本时,我必须记住在我的项目中也要更新库D的版本。这很容易忘记

有没有办法告诉maven只使用最新版本的可传递库
比如:

<dependencyManagement>
    ...
    <dependency>
        <groupId>path.to</groupId>
        <artifactId>library-D</artifactId>
        <version>
            <use_newest_one_from_all_transitive_dependencies_please/>
        </version>
    </dependency>

...
路径
图书馆-D

有没有办法做到这一点?

没有,正如赫马尔拜斯所说,这是不可能的

解决方案规则深深扎根于Maven本身。您可以检查解析的结果(正如您已经提到的),但不能更改它


我们决定通过使用我们在
部分导入的适当的BOM(依赖项管理列表),修复几乎所有版本的可传递依赖项。这保证了所有依赖项都是最新版本的。这并不能保证所有的东西都能放在一起。但是使用最新版本作为标准也不能做到这一点。

您可以添加依赖项,然后按照建议自动管理它。这使用了。当然,它将采用最新版本,而不是最新的可传递依赖项版本。版本范围也是一种可能性,但不鼓励使用它们。

对此的简单回答是:不……算法就是这样使用最接近您的项目的版本……通常库B+C的维护者应该使用相同的版本(不会一直工作)或者您必须通过dependencyManagement否决应该使用的D版本。最后一个问题是:B与版本2一起工作还是C与版本1一起工作?两者都可能失败…只能通过测试进行检查…或者如果更糟,您的构建将无法编译/测试将失败…如果
B
C
可以使用较旧版本的
D
运行(至少是对您有用的方法),您可以
B
C
中排除
可传递依赖项
D
,然后在
a
中添加较旧的(但不变的)
D
作为直接依赖项。使用
exclusion
标记将传递词排除在编译时之外。@nipuntathsara如果要选择版本,只需使用
。无需排除。