2012-07-10 72 views
5

我有以下的ivy文件:常春藤,什么是主配置,为什么它不拉jvyaml?

<configurations defaultconfmapping="buildtime"> 
    <conf name="buildtime" visibility="private" description="Libraries needed only for compilation" /> 
    <conf name="runtime" description="Libraries only needed at runtime" /> 
    <conf name="test" description="Libraries only needed for testing" /> 
</configurations> 

<dependencies> 
    <dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime" /> 
    <dependency org="org.apache.solr" name="solr-core" rev="3.6.0" conf="runtime" /> 

</dependencies> 

,我有一只蚂蚁检索任务,看起来像这样:

<target name="retrieve-all" depends="resolve"> 
    <ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]" conf="*" /> 
</target> 

奇怪的是,所有solr依赖下载到lib/runtime,如我所料,但jvyaml模块不!这是解决“,但除非我改变依赖声明不会下载到lib/runtime目录:

<dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->master" /> 

这是什么主配置,以及为什么需要它拉jvyaml罐子,但不SOLR?

谢谢

回答

19

我建议你转型的配置如下:介绍

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="demo"/> 

    <configurations> 
     <conf name="compile" description="Libraries needed only for compilation" /> 
     <conf name="runtime" description="Libraries only needed at runtime" extends="compile" /> 
     <conf name="test" description="Libraries only needed for testing" extends="runtime" /> 
    </configurations> 

    <dependencies> 
     <dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->default" /> 
     <dependency org="org.apache.solr" name="solr-core" rev="3.6.0" conf="runtime->default" /> 
    </dependencies> 

</ivy-module> 

重要的变化:

  1. 使用更多标准的“编译”配置
  2. 配置继承使用“扩展”属性。编译依赖关系可以自动包含在运行时和测试配置中。
  3. 使用配置映射,例如:conf =“runtime-> default”。这使得显而易见哪个本地配置与哪个远程配置相关联。

配置映射解释

配置是一个强大的常春藤功能。当常春藤下载Maven的模块其执行内部翻译,并指定一组标准的配置,在这个回答中列出:

在声明依赖这是一个好主意,总是利用的配置映射,所以毫无疑问依赖关系工件被分配到哪里。

例如:

<dependency org="??" name="??" rev="??" conf="runtime->default" /> 

这里,我们说,我们希望与我们的本地运行时配置相关的远程模块的默认依赖。

在实践中,只有两个你真正需要远程配置映射:

  • 默认:远程模块的神器和所有它的运行时间传递依赖
  • :远程模块只有神器(无传递依赖)

总之,我认为你的问题是由于远程ËMaven的模块的“运行”范围不包括Maven的模块的神器,而不是你得到模块jvyaml的不存在的传递依赖:-(

一些其他建议

我也建议产生常春藤依赖关系管理报告如下:

<target name="init" description="Resolve dependencies and populate lib dir"> 
    <ivy:resolve/> 
    <ivy:report todir="${build.dir}/ivy-report" graph="false"/> 
    <ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]"/> 
</target> 

该报告将帮助解释每个依赖项如何在不同的配置下结束。对于确定如何管理传递依赖关系也非常有用。

最后,这里的地方配置继承不负有心人,创建常春藤管理ANT类路径:

<target name="init" description="Resolve dependencies and set classpaths"> 
    <ivy:resolve/> 
    <ivy:report todir="${build.dir}/ivy-report" graph="false"/> 

    <ivy:cachepath pathid="compile.path" conf="compile"/> 
    <ivy:cachepath pathid="runtime.path" conf="runtime"/> 
    <ivy:cachepath pathid="test.path" conf="test"/> 
</target> 
+0

非常感谢。你解释得很好。我读过一堆文档,包括:http://ant.apache.org/ivy/history/latest-milestone/tutorial/conf.html,但只是更加困惑。 – rainkinz 2012-07-10 21:29:26

+1

请将apache文档与此交换。谢谢@ Mark – 2012-07-16 08:55:58

+0

谢谢马克,你刚刚对我说得很清楚。 +100 – 2012-09-20 14:05:23

2

请注意,最初的solr核心也没有被检索。 解决之后,转到缓存并检查两个模块的ivy.xml文件。

你会看到,他们会出版的文物中的conf =主只

<artifact name="jvyaml" type="jar" ext="jar" conf="master"/> 

<artifact name="solr-core" type="jar" ext="jar" conf="master"/> 

这意味着,你必须做明确的配置映射来表示你的builtime配置应该唤起你依赖的“主人”的配置。 (检查配置映射)。

然而,Solr的核心的依赖,具有配置映射,你可以在ivy.xml文件看到:

<dependency org="org.apache.solr" name="solr-solrj" rev="3.6.0" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/> 

我认为这是主(*)啄。

我最常做的是我自己的ivy.xml文件时,我声明依赖我做的映射:

<dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->master" /> 

这一个说,运行时被唤起的指定依赖主配置。

你可以做

conf="runtime,test->master" 

以及