这是一个例子。我们正在处理 ivy 2.1 和 ant 1.8.3 。我们的一个项目直接依赖于' math'版本5.1 和' common'版本1.4.6 。但是,常见的'直接依赖' math'版本5.2 。
<dependencies>
<dependency org="home" name="math" revision="5.1" conf="runtime" />
<dependency org="home" name="common" revision="1.4.6" conf="runtime" />
</dependencies>
确定该决议将收集&#39;数学&#39;版本5.2 由于&#39; 常见的直接依赖性。 由于它会导致编译器错误,我想使用&#39; math&#39; 5.1 因此我试图在所有依赖标记之后将正确的覆盖标记放入ivy xml中:
<override org="home" module="math" rev="5.1" />
它应该工作并只收集版本5.1。事实证明它实际上可以在 IntelliJ IDEA 14 和 Eclipse 4.3 中工作,所以在相应的常春藤插件的解析之后,我只能看到& #39;数学&#39;项目库中的5.1版。我在Ivy Visualizer视图中检查了依赖图,看起来很好。
然而,当我使用一个合适的ant构建目标时,它会因编译错误而失败,因为它解析了&#39; math&#39;版本5.2 而不是5.1( !! )。
根据常春藤的文档覆盖
当直接依赖带来传递时,&#34;会很有用 您想要更改修订的依赖项,而不是实际的 声明对它的依赖&#34;
还声称
在称为依赖项的阶段中,覆盖在其他任何事件之前完成 描述符调解。传递依赖性的行为完全如同 如果它是用新值声明的。
因此它也应该与ant build一起使用,但表现与预期相矛盾。 最终我们发现依赖标记的force属性( force =&#34; true&#34; )是抢救结果IDE之后的预期库结构&#39;并在蚂蚁构建决议之后。基于常春藤文档:
...依赖元素也支持一个force属性(从0.8开始), 这表明冲突经理强制修改 依赖于这里给出的依赖。
为什么覆盖标记会导致不同工具的矛盾行为以及为什么强制=&#34; true&#34;有效吗?如果有人能突出(轻微的)差异,我将不胜感激。
答案 0 :(得分:0)
我从未使用过覆盖功能,而是一直使用force =“ true”,并且在“大多数”情况下效果很好。
我今天确实遇到了一个开发人员的问题,其中的force =“ true”似乎有效(摘要显示选择正确版本(强制版本)时发生冲突)。但是随后,由于单个文件发生冲突,它选择了退出模块的版本,不知道为什么。