常春藤,什么是主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>
重要变化介绍:
- 使用更标准的“编译”configuration
- 使用“extends”属性进行configurationinheritance 。 编译依赖关系可以自动包含在运行时和testingconfiguration中。
- 使用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"
以及