我正在尝试使用Ivy自动下载运行PMD和Findbugs所需的JAR文件。在大多数情况下,我下载依赖项、设置cachepath
等等都没有问题。问题是,如果我使用Ant运行PMD,我只想下载PMD依赖项,Findbugs也一样。因此,我制作了两个不同的XML文件来定义依赖关系,conf/ivy/pmd.xml
和conf/ivy/findbugs.xml
,我的PMD任务类似于:
<ivy:retrieve file="conf/ivy/pmd.xml"/>
<ivy:cachepath pathid="pmd.path"/>
如果在单个Ant调用中我只使用PMD或只使用Findbugs,那么这就可以很好地工作。但是,如果我尝试在一次调用中同时使用这两个任务,那么要运行的第二个ivy:cachepath
任务与要运行的第一个任务完全相同,尽管它们具有不同的file
属性。
问题是Ivy retrieve
任务是一个解析后的taks,如果尚未运行resolve
任务,则会自动/隐式运行该任务,因此第一个retrieve
任务是唯一导致解析的任务。
解决方案是将所有依赖项放入一个Ivy模块配置文件中,使不同的依赖项成为不同配置的一部分,然后在调用retrive
任务时使用conf
属性。例如,我在单个文件conf/ivy/ivy.xml
:中设置了"findbugs"conf和"pmd"conf
<ivy-module version="2.0">
<info organisation="com.nightrealms" module="JavaLike"/>
<configurations>
<conf name="findbugs" description="findbugs JAR files"/>
<conf name="pmd" description="PMD JAR files"/>
</configurations>
<dependencies>
<dependency org="net.sourceforge.pmd" name="pmd-core" rev="5.3.2"
conf="pmd->default"/>
<dependency org="net.sourceforge.pmd" name="pmd-java" rev="5.3.2"
conf="pmd->default"/>
<dependency org="com.google.code.findbugs" name="findbugs"
rev="3.0.1" conf="findbugs->default"/>
</dependencies>
</ivy-module>
然后在build.xml
:中
<ivy:retrieve file="conf/ivy/ivy.xml" conf="findbugs"/>
每次调用retrieve Ivy都会设置一些ant属性。Ant属性是不可变的,所以这意味着您只能调用retrieve一次。
但是,您可以使用AntCall来解决此问题。每次使用AntCall任务时,您都会从蚂蚁属性的全新开始。请注意,AntCall还清除了已经运行的目标,因此dependent中的所有目标都将再次运行。
<target name="resolve" description="">
<antcall target="resolve.ivyfile1"/>
<antcall target="resolve.ivyfile2"/>
</target>
<target name="resolve.ivyfile1" description="">
<ivy:retrieve file="ivy1.xml"/>
</target>
<target name="resolve.ivyfile2" description="">
<ivy:retrieve file="ivy2.xml"/>
</target>
这也会对ivy Publishes和Reports产生影响,但这些方面会根据您的确切使用场景而有所不同,因此最好在新问题中详细阐述。