6

我有以下常春藤文件:

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

谢谢

4

2 回答 2

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. 使用“扩展”属性的配置继承。然后,编译依赖项可以自动包含在运行时和测试配置中。
  3. 使用配置映射,例如:conf="runtime->default"。这使得哪个本地配置与哪个远程配置相关联变得一目了然。

配置映射解释

配置是一个强大的 ivy 功能​​。当常春藤下载 Maven 模块时,它会执行内部翻译并分配一组标准配置,如以下答案所示:

在声明依赖项时,最好始终使用配置映射,以便毫无疑问地分配依赖项工件的位置。

例如:

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

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

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

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

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

最后,这里是配置继承得到回报的地方,创建了 ivy 托管的 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>
于 2012-07-10T19:13:55.183 回答
2

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

您将看到他们仅在 conf=master 中发布其工件

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

以及

于 2012-07-10T18:14:19.853 回答