Ivy:具有不同依赖文件的多个检索任务



我正在尝试使用Ivy自动下载运行PMD和Findbugs所需的JAR文件。在大多数情况下,我下载依赖项、设置cachepath等等都没有问题。问题是,如果我使用Ant运行PMD,我只想下载PMD依赖项,Findbugs也一样。因此,我制作了两个不同的XML文件来定义依赖关系,conf/ivy/pmd.xmlconf/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产生影响,但这些方面会根据您的确切使用场景而有所不同,因此最好在新问题中详细阐述。

相关内容

  • 没有找到相关文章

最新更新