0

我有一个看起来像这样的 build.xml

<target name="foo">
    <subant failonerror="false" target="p1">
        <fileset dir="." includes="build.xml"/>
    </subant>
    <subant failonerror="false" target="p2">
        <fileset dir="." includes="build.xml"/>
    </subant>
    <subant failonerror="false" target="p3">
        <fileset dir="." includes="build.xml"/>
    </subant>
</target>

当我这样做时,ant foo所有子程序都同时运行。如何让它们按顺序运行 p1、p2、p3。

4

2 回答 2

5

这是您build.xml文件的一部分吗?

通常,<subant/><antcall/>任务是创建开发人员build.xml不了解 Ant 的标志。

Ant 不是 Python、Java、C 等编程语言,它是一种依赖矩阵语言。也就是说,你给它构建目标,以及构建什么的说明。例如,您可能有一个名为jar的目标来构建您的 Jar 文件。此任务主要由<jar>命令组成。

您所做的是说出您的 jar 命令所依赖的内容。例如,它可能取决于您编译代码。因此,您说这取决于您的编译目标。编译可能需要从 ivy.xml 文件构建类路径,并将 WSDL 文件转换为 Java 代码以进行编译。

但是,在从ivy.xml文件创建类路径之前,您必须先解决它。而且,在将 WSDL 文件转换为 Java 代码之前,您需要从项目网站获取最新版本的 WSDL。

我不必要求 Ant 做任何这些。我要求它做的只是构建 Jar,Ant 弄清楚了构建 jar 需要做什么。我已经放弃了程序员告诉 Ant 完成特定任务必须采取的每一步的思维方式,我必须相信 Ant 能够弄清楚它需要做什么以及按照什么顺序执行。


您说您希望这些任务以特定顺序运行。你给 Ant 带来了错误的心态,如果这个foo目标是试图强制命令,那就是错误的方式。

问问自己你真正想做什么。不,您不想按该顺序构建p1, 。p2p3

您可能想要做的是构建任何p3构建。也许这是一个罐子或一场战争。也许这是对您网站的战争或耳朵部署。这就是你真正非常想做的事情。您不在乎是否需要先运行,p2或者p1是否p1需要先p2执行。放弃告诉 Ant 每一步怎么做的概念。

现在,为了让您build.xml执行目标p3(部署您的战争),它必须首先执行目标p2(构建要部署的战争)。那是对p3.

现在,也许p2要执行目标,它首先必须运行p1任务(编译 Java 代码以创建您的战争所需的类)。p2这是对任务的依赖。

build.xml这是一个显示此依赖关系树的新简单程序。注意我不使用<antcall>,<ant><subant>任务。我只是依靠 Ant 自己弄清楚要做什么。

<project>
     <target name="p1">
         <echo>Running P1: Building the class files from the Java source.</echo>
     </target>
     <target name="p2"
         depends="p1">
         <echo>Running P2: Building the war we're going to deploy.</echo>
     </target>
    <target name="p3"
         depends="p2">
        <echo>Running P3: Deploying the war.</echo>
     </target>
</project>

现在我将运行 Ant 指定我真正想要完成的目标:

$ ant p3
Buildfile: /Users/david/build.xml

p1:
     [echo] Running P1: Building the class files from the Java source.

p2:
     [echo] Running P2: Building the war we're going to deploy.

p3:
     [echo] Running P3: Deploying the war.

BUILD SUCCESSFUL

请注意,这确实p1, p2, and p3按该顺序运行。然而,在这个文件中,我实际上没有说过我想要这样做,而且我真的不在乎。我只想跑p3。Ant 根据依赖关系树找出它需要运行的目标。

于 2013-11-20T15:33:16.387 回答
1

看起来顺序任务可以满足您的需求。例子:

<target name="default">
    <sequential>
        <echo message="111"/>
        <echo message="222"/>
    </sequential>
</target>

depends你也可以在like中指定多个目标<target name="t0" depends="t1,t2,t3">

于 2013-11-20T15:44:59.483 回答