【发布时间】:2015-05-19 10:54:28
【问题描述】:
这是一个例子。我们正在处理 ivy 2.1 和 ant 1.8.3。我们的一个项目直接依赖于 'math' 版本 5.1 和 'common' 版本 1.4.6。但是 'common' 直接依赖于 '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>
由于 'common 的直接依赖关系,可以肯定该解析将收集 'math' 版本 5.2。 由于它会导致编译器错误,我想使用 'math' 5.1,因此我尝试在所有依赖项标签之后将正确的 override 标签放入 ivy xml:
<override org="home" module="math" rev="5.1" />
它应该工作并且只收集 5.1 版本。事实证明,它实际上在 IntelliJ IDEA 14 和 Eclipse 4.3 中工作,所以在各自的 ivy 插件解析之后,我只能看到 'math' 版本 5.1 在项目的库中。我检查了 Ivy Visualizer 视图中的依赖关系图,看起来还不错。
但是,当我使用合适的 ant 构建目标之一时,它会因编译错误而失败,因为它解析的是 'math' 版本 5.2 而不是 5.1(!!)。
根据 ivy 的文档覆盖
" 在直接依赖带来传递性时很有用 您想要更改修订版的依赖项,实际上没有 声明对它的依赖”
据说
覆盖在任何其他操作之前完成,在一个称为依赖的阶段 描述符中介。然后传递依赖的行为与 如果它是用新值声明的。
因此它也应该与 ant build 一起使用,但行为与预期相矛盾。 最终我们发现依赖标签的 force 属性 (force="true") 是救援,它在 IDE 和 ant 之后产生了预期的库结构建立分辨率。基于常春藤文档:
...dependency 元素还支持一个 force 属性(从 0.8 开始), 指示冲突管理器强制进行修订 与此处给出的依赖关系。
为什么覆盖标签会导致不同工具的矛盾行为以及为什么 force="true" 有效?如果有人能突出(轻微?)差异,我将不胜感激。
【问题讨论】:
标签: java eclipse ant intellij-idea ivy