如何在build.xml文件中创建动态路径/文件集元素或其他随机XML节点

时间:2015-02-20 22:30:00

标签: ant

我有一个项目,在其他项目(相同的代码库)上有许多编译时依赖项。 因此编译类路径的定义方式如下:

<path id = "compile.classpath">
  <fileset dir="${dependency-a.dist.dir}">
    <include name ="*.jar"/>
  </fileset>
  <fileset dir="${dependency-b.dist.dir}">
    <include name ="*.jar"/>
  </fileset>
  <fileset dir="${dependency-c.dist.dir}">
    <include name ="*.jar"/>
  </fileset>
  <fileset dir="${dependency-d.dist.dir}">
    <include name ="*.jar"/>
  </fileset>
</path>

此外,您可以为依赖项创建相应的build目标,依此类推。 为了减少重复,我需要以某种方式动态生成这些结构。

我认为捕获这些依赖项的一种Ant友好方式可能是创建一个deps目录并将sym-links添加到我项目的所有编译时依赖项中。

所以问题是:是否有一种Ant方式来编写macrodef或自定义Ant任务,该任务将扫描该目录(或者,读取配置文件)并扩展到/生成必要的文件集/自动构建目标,实际上是在运行时更改build.xml文件的XML节点?我正在寻找一种通用的Ant方法(如果存在的话),所以我不必使用更具破坏性的方法从其他配置中完整地生成build.xml文件。我不是在问如何使用subant等,因为我想知道是否可能存在更广泛的在运行时扩展/丰富Ant构建文件的能力,这也适用于不涉及构建依赖性的其他情况。

2 个答案:

答案 0 :(得分:3)

编写构建路径的任务非常简单,但是一旦解析了构建文件,就会修复Ant目标。 Ant构建目标的有向图,然后执行它们。

可以通过任何目标本身之外的任务添加新目标。 include是一项任务。有可能通过自定义任务生成包含所需路径和目标的构建文件片段,以便稍后包含它。遗憾的是,include不允许您将其嵌入macrodef中,因此这两个步骤必须成对出现。

当然,您可以使用Ant的API而不是include来添加路径和目标。您已在收到的Path个实例上使用getReference获取现有Project,并将文件集添加到其中。完全新的数据类型使用addReferenceaddTarget用于目标。

答案 1 :(得分:0)

您是否考虑过使用ivy?它是一个依赖关系管理器,提供一组可用于控制类路径的ANT任务,但它也可以从托管存储库(如Maven)下载jar。

以下答案可以让您了解如何使用常春藤:

Ivy提供了更强大的解决方案,因为它还可以防止相同jar的冲突版本。例如,几个依赖项都包含像log4j这样的常见jar的副本。

总之,常春藤看起来似乎很复杂,但我可以向你保证,它解决了一个复杂的问题。