常春藤,什么是主configuration,为什么不拉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> 

我有一个ant检索任务,看起来像这样:

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

奇怪的是,所有solr依赖项下载到lib /运行时,如我所料,但jvyaml模块不! 它“解决”,但不会下载到lib / runtime目录中,除非我将依赖声明更改为:

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

什么是主configuration,为什么需要拉jvyaml jar,但不是solr?

谢谢

我会build议重构你的configuration如下:

 <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. 使用更标准的“编译”configuration
  2. 使用“extends”属性进行configurationinheritance 。 编译依赖关系可以自动包含在运行时和testingconfiguration中。
  3. 使用configuration映射 ,例如:conf =“runtime-> default”。 这使得显而易见哪个本地configuration与哪个远程configuration相关联。

configuration映射解释

configuration是一个强大的常春藤function。 当常青藤下载Maven模块时,它会执行一个内部转换并分配一组标准configuration,列在这个答案中:

  • 如何将maven作用域映射到常青藤的ivyconfiguration

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

例如:

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

这里我们要说远程模块的默认依赖与我们的本地运行时configuration相关联。

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

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

总之,我认为你的问题是由远程Maven模块的“运行时”范围不包括Maven模块的工件造成的,相反,你得到了模块jvyaml的非传递依赖关系:-(

一些额外的build议

我也build议生成一个常春藤依赖pipe理报告,如下所示:

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

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

最后,这里是configurationinheritance的成果,创build了ivy托pipe的ANT类path:

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

注意最初的solr-core也没有被检索。 解决之后,转到caching并检查两个模块的ivy.xml文件。

你会看到他们仅在conf = master中发布他们的工件

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

这意味着,你必须做显式的configuration映射来表示你的builtimeconfiguration应该唤起你的依赖关系的“主”configuration。 (检查configuration映射)。

然而,solr-core的依赖关系,具有configuration映射,你可以在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" /> 

这个表示运行时正在唤起指定的依赖关系中的主configuration。

你可以做

 conf="runtime,test->master" 

以及