关于java:是否可以归纳Apache ANT目标?

关于java:是否可以归纳Apache ANT目标?

Is there a way to generalize an Apache ANT target?

我们有一个Apache ANT脚本来构建我们的应用程序,然后将生成的JAR文件检入版本控制(在这种情况下为VSS)。 但是,现在有了更改,要求我们为此项目构建2个JAR文件,然后将两者都检入VSS。

将原始JAR文件检入VSS的当前目标通过一些属性发现JAR文件的名称。 有没有一种简单的方法可以"通用"此目标,以便我可以重用它以任何名称检入JAR文件? 在普通语言中,这显然需要一个函数参数,但是据我所知,在ANT中确实没有等效的概念。


我建议使用Subant / antcall上的宏,因为我发现宏的主要优点是您可以完全控制传递给宏的属性(特别是如果要添加新属性)。

您只需从目标开始重构您的Ant脚本即可:

1
2
3
4
<target name="vss.check">
    <vssadd localpath="D:\build\build.00012.zip"
        comment="Added by automatic build"/>
</target>

创建一个宏(注意复制/粘贴并用@ {file}替换):

1
2
3
4
5
6
7
<macrodef name="private-vssadd">
   
    <sequential>
        <vssadd localpath="@{file}"
            comment="Added by automatic build"/>
    </sequential>
</macrodef>

并使用文件调用宏:

1
2
3
4
<target name="vss.check">
    <private-vssadd file="D:\build\File1.zip"/>
    <private-vssadd file="D:\build\File2.zip"/>
</target>

重构"蚂蚁之路"


通常,对二进制文件进行版本控制是个坏主意,我不建议您这样做。但是如果绝对必要,则可以将antcall与param结合使用以传递参数并调用目标。

1
2
3
4
5
6
    <param name="some.variable" value="var1"/>
</antcall>

<target name="reusable">
    <!-- Do something with ${some.variable} -->
</target>

您可以在此处找到有关antcall任务的更多信息。


看一下Ant宏。它们允许您为Ant构建定义可重用的"例程"。您可以在此处找到一个示例(项目15)。


还请签出subant任务,该任务可让您在多个构建文件上调用同一目标:

1
2
3
4
5
6
7
8
9
10
<project name="subant" default="subant1">
    <property name="build.dir" value="subant.build"/>
    <target name="subant1">
        <subant target="">
            <property name="build.dir" value="subant1.build"/>
            <property name="not.overloaded" value="not.overloaded"/>
            <fileset dir="." includes="*/build.xml"/>
        </subant>
    </target>
</project>

您可以使用Gant来用groovy编写构建脚本,以执行所需的操作或查看groovy ant任务。


推荐阅读