我向 ivy.xml 添加了一个依赖项(让我们将其命名为 A),该文件在 Maven 中心有一个 pom 文件。 Ivy 使用 ibiblio 来解决 Maven 依赖关系。添加到ivy.xml 的依赖项(A) 具有传递依赖项(B)。到目前为止一切顺利。传递依赖(B)的依赖(C)无法通过ivy解决。
我在ivy.xml中定义了A,如下所示:
<dependency org="Z" name="A" rev="0.6-SNAPSHOT" conf="*->default"/>
在 B 的 pom 文件中,C 在编译和测试范围中都定义如下:
<dependency>
<groupId>X</groupId>
<artifactId>C</artifactId>
</dependency>
<dependency>
<groupId>X</groupId>
<artifactId>C</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
当我在ivy的缓存文件(~/.ivy2/cache/X/C/ivy-0.98.8-hadoop2.xml)中查看由ivy解析的B的xml文件时,它看起来像这样:
<dependency org="X" name="C" rev="0.98.8-hadoop2" force="true" conf="test->runtime(*),master(*)"/>
<dependency org="X" name="C" rev="0.98.8-hadoop2" force="true" conf="test->runtime(*),master(*)">
<artifact name="C" type="test-jar" ext="jar" conf="" m:classifier="tests"/>
</dependency>
因此,ivy 无法正确定义 C 作用域。根据记录,我无权修改 pom 文件,因为它们是第三方项目。我该如何解决它?
最佳答案
我回顾了 nutch project 的 Ivy 用法抱歉,但我的结论是它过于复杂,原因如下:
- “编译”和“测试”目标分别向解析任务发出调用
- 每个插件还调用 ivy 解析任务
- 维护类路径的复杂逻辑。可以使用 cachepath 进行简化任务和ivy配置。
- 构建插件不由 ivy(Sonar、eclipse、rat)管理
我开始重构构建,但当我意识到我不理解主要的 nutch Artifact 和插件之间的关系时,不得不停止......(我发现 NUTCH-1515 的困难方式......浪费大量时间 Feed 插件缺少依赖项)。
我还注意到问题 NUTCH-1371呼吁拆除 Ivy 。如果不对当前代码库进行重大更改,这将是一次棘手的重构。我怀疑它必须是一个多模块构建,每个插件都列出自己的依赖项。
总之,这项工作并没有回答你的问题,但我认为我至少需要记录几个小时分析的结果:-)根据NUTCH-1371不知道你的项目是否能够容忍重大的ivy重构?
重构ivy
以下是我迄今为止所取得的成就:
好处:
- 显示所有配置的单个 ivy 报告(新 ivy-resolve target )
- 安装 ivy 的新机制(新 ivy-install target )
- 使用 ivy 配置管理类路径(请参阅 ivy cachepath 任务和 configurations in ivy file 的使用)
- 使用 ivy 自动安装 Eclipse、声纳和rat ANT 任务(Eclipse 插件值得注意,因为它使用 packager resolver 从 tar 存档下载并提取 jar)。
影响以下 Nutch 问题
- NUTCH-1881 :这种新方法删除了resolve-test和resolve-default目标,并使用ivy而不是${build.lib.dir}来管理类路径
- NUTCH-1805 :可以轻松地为作业目标设置单独的配置及其自己的依赖项。
- NUTCH-1755 :我认为这个问题可以通过为 build.xml 指定一个名称来解决(请参阅: diff )
关于java - Ivy 无法解析依赖关系的范围,该依赖关系是传递依赖关系的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27721507/