常春藤,什么是主配置,为什么不拉jvyaml?

时间:2012-07-10 16:00:27

标签: ant ivy

我有以下常春藤文件:

    

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

我有一个如下所示的ant检索任务:

<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 jar,而不是solr?

由于

2 个答案:

答案 0 :(得分:20)

我建议按如下方式重构您的配置:

<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. 使用“extends”属性
  3. 配置继承。然后,编译依赖项可以自动包含在运行时和测试配置中。
  4. 使用配置映射,例如:conf =“runtime-&gt; default”。这使得哪个本地配置与哪个远程配置相关联显而易见。
  5. 解释了配置映射

    配置是强大的常春藤功能。当ivy下载Maven模块时,它会执行内部翻译并分配一组标准配置,在此答案中列出:

    在声明依赖项时,总是使用配置映射是个好主意,因此毫无疑问,依赖项工件的分配位置。

    例如:

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

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

    实际上,实际上只需要两个远程配置映射:

    • 默认:远程模块的工件及其所有运行时传递依赖项
    • master :仅限远程模块的工件(无传递依赖项)

    总之,我认为您的问题是由于远程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>
    

答案 1 :(得分:2)

请注意,也未检索到原始的solr-core。 解决后,转到缓存并检查两个模块的ivy.xml文件。

您将看到他们在conf = master only

中发布他们的工件
<artifact name="jvyaml" type="jar" ext="jar" conf="master"/>

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

这意味着,您必须进行显式配置映射,以表示您的构建时配置应该唤起依赖项的“主”配置。 (检查配置映射)。

然而,solr-core的依赖关系具有你在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"

以及