我正在尝试使用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或仅使用Findbug,则此方法很好。但是,如果我尝试在一次调用中同时使用两者,那么即使它们具有不同的ivy:cachepath
属性,要运行的第二个file
任务的行为也与第一个任务完全相同。
问题是Ivy retrieve
task是retrieve
,并且如果尚未运行post resolve taks任务,则会自动/隐式运行resolve
任务,因此第一个retrieve
任务是引起解析的唯一任务。
解决方案是将所有依赖项放入单个Ivy module configuration file中,使不同的依赖项成为不同配置的一部分,然后在调用conf
任务时使用retrive
属性。例如,我在单个文件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"/>
每次调用检索常春藤都会设置一些蚂蚁属性。 Ant属性是不可变的,因此这意味着您只能调用一次检索。