2014-12-31 165 views
1

我在iven.xml中添加了一个依赖项(让我们将其命名为A),它在maven central中有一个pom文件。常春藤使用ibiblio来解决Maven的依赖关系。添加到ivy.xml的依赖项(A)具有传递依赖性(B)。到目前为止这么好。传递依赖关系(B)的依赖关系(C)不能由常青藤解决。常春藤无法解决作为传递依赖项依赖项的依赖项的范围

我的ivy.xml定义的这样的:

<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> 

当我看的B的xml文件是由常春藤常春藤的缓存文件(〜/ .ivy2 /缓存/ X/C /常春藤-0.98.8-hadoop2.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> 

因此,常春藤不能正确定义C作用域。为了记录,我没有权限修改POM文件,因为它们是第三方项目。我该如何解决它?

+0

我是很新的Maven的,但在我的环境中也不会拉的依赖如果'version'元素没有被包含在pom.xml中的组和工件ID中 - 是否有帮助? – Mikaveli

+0

B的pom文件是一个孩子pom。因为它没有版本标签。顺便说一句,如果我在Maven项目中使用A没有问题。我认为常青藤不能正确映射子依赖项的范围B. – Talat

+0

如果该模块位于Maven Central,为什么不把它作为示例?按照现状,我不明白问题在哪。 –

回答

0

我回顾了nutch project和道歉的常春藤使用,但我的结论是,这是由于以下原因过于复杂:

  • “编译”和“测试”的目标正在发行的决心任务
  • 单独的呼叫
  • 每个插件也调用常春藤解决任务
  • 维护类路径的复杂逻辑。可以使用cachepath任务和ivy配置进行简化。
  • 构建插件不被常青藤管理(声纳,蚀,鼠)

我开始重构构建,而不得不停产时,我意识到,我不明白主Nutch的神器之间的关系和插件...(我发现NUTCH-1515困难的方式...大时间浪费饲料插件缺少依赖关系)。

我也注意到问题NUTCH-1371呼吁删除常春藤。这将是一个棘手的重构,没有对当前代码库进行重大改变。我怀疑它必须是一个多模块构建,每个插件列出它自己的依赖关系。

总之,这项工作没有回答你的问题,但认为我需要至少记录几小时分析的结果:-)根据NUTCH-1371我不知道你的项目是否会容忍主要的常春藤重构?

重构常春藤

这里遵循什么我实现迄今:

优点:

影响下面的Nutch发出

  • NUTCH-1881:这种新的方法消除决心测试和解决违约的目标和使用,而不是$常春藤管理类路径{} build.lib.dir
  • NUTCH-1805:可以使用它自己的依赖项轻松地为作业目标设置单独的配置。
  • NUTCH-1755:我觉得这是一个通过向指定名称固定的build.xml(见:diff
+0

你真的很棒。非常感谢你。你的工作很棒。如果你没事的话,我会审查并创建一个补丁。是的,我们现在讨论maven maven不适合我们。我想我们仍然继续使用常春藤。如果你想帮助我们解决我们的常春藤问题,我们将不胜感激。 – Talat

+0

@Talat我还没有准备好提交我自己的补丁,因为我不确定我的更改是否100%向后兼容。我会感谢审查。我很乐意提供帮助。 –