我建议按如下方式重组您的配置:
<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>
引入的重要变化:
- 使用更标准的“编译”配置
-
配置继承使用“扩展”属性。然后,编译依赖项可以自动包含在运行时和测试配置中。
-
使用配置映射,例如:conf="runtime->default"。这使得哪个本地配置与哪个远程配置相关联变得显而易见。
配置映射解释
配置是 ivy 的一项强大功能。当 ivy 下载 Maven 模块时,它会执行内部转换并分配一组标准配置,如以下答案所示:
- ivy如何将maven范围映射到ivy配置 https://stackoverflow.com/questions/7104364/how-are-maven-scopes-mapped-to-ivy-configurations-by-ivy/7116577#7116577
声明依赖项时,最好始终使用配置映射,这样就可以明确依赖项工件的分配位置。
例如:
<dependency org="??" name="??" rev="??" conf="runtime->default" />
在这里,我们说我们希望远程模块的默认依赖项与本地运行时配置相关联。
实际上,您实际上只需要两个远程配置映射:
-
default:远程模块的工件及其所有运行时传递依赖项
-
master:仅远程模块的工件(无传递依赖)
总之,我认为你的问题是由于远程 Maven 模块的“运行时”范围不包括 Maven 模块的工件而引起的,而是你得到了模块 jvyaml 不存在的传递依赖项:-(
一些额外的建议
我还建议生成一份ivy依赖管理报告,如下所示:
<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>