我有一个项目,在其他项目(相同的代码库)上有许多编译时依赖项。 因此编译类路径的定义方式如下:
<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构建文件的能力,这也适用于不涉及构建依赖性的其他情况。
答案 0 :(得分:3)
编写构建路径的任务非常简单,但是一旦解析了构建文件,就会修复Ant目标。 Ant构建目标的有向图,然后执行它们。
可以通过任何目标本身之外的任务添加新目标。 include
是一项任务。有可能通过自定义任务生成包含所需路径和目标的构建文件片段,以便稍后包含它。遗憾的是,include
不允许您将其嵌入macrodef
中,因此这两个步骤必须成对出现。
当然,您可以使用Ant的API而不是include
来添加路径和目标。您已在收到的Path
个实例上使用getReference
获取现有Project
,并将文件集添加到其中。完全新的数据类型使用addReference
,addTarget
用于目标。
答案 1 :(得分:0)
您是否考虑过使用ivy?它是一个依赖关系管理器,提供一组可用于控制类路径的ANT任务,但它也可以从托管存储库(如Maven)下载jar。
以下答案可以让您了解如何使用常春藤:
Ivy提供了更强大的解决方案,因为它还可以防止相同jar的冲突版本。例如,几个依赖项都包含像log4j这样的常见jar的副本。
总之,常春藤看起来似乎很复杂,但我可以向你保证,它解决了一个复杂的问题。