执行

描述

执行系统命令。当指定 os 属性时,仅当在指定的某个操作系统上运行 Apache Ant 时才执行命令。

请注意,您无法与派生程序交互,向其发送输入的唯一方式是通过 input 和 inputstring 属性。另请注意,自 Ant 1.6 起,派生程序中读取输入的任何尝试都将收到 EOF (-1)。这是 Ant 1.5 的一项更改,其中此类尝试将被阻止。

如果您想使用相对于项目 basedir 的路径执行可执行文件,则可能需要在某些操作系统上使用 vmlauncher=false — 但即使这样也可能失败(据报告 Solaris 8/9 有问题)。resolveexecutable 属性应该更可靠,就像

<property name="executable-full-path"
          location="../relative/path/to/executable"/>
<exec executable="${executable-full-path}" ...

Windows 用户

<exec> 任务委托给 Runtime.exec,而后者显然调用 ::CreateProcess。后者 Win32 函数定义了调用的确切语义。特别是,如果您没有在可执行文件中放置文件扩展名,则仅查找 .EXE 文件,而不是 .COM.CMD 或环境变量 PATHEXT 中列出的其他文件类型。这仅由 shell 使用。

请注意,.bat 文件通常不能直接执行。通常需要使用 /c 开关执行命令 shell 可执行文件 cmd

<target name="help">
  <exec executable="cmd">
    <arg value="/c"/>
    <arg value="ant.bat"/>
    <arg value="-p"/>
  </exec>
</target>

一个常见的问题是 PATH 中没有可执行文件。如果您收到错误消息 无法运行程序 "...":CreateProcess error=2。系统找不到指定路径。,请查看您的 PATH 变量。只需直接在命令行中键入命令,如果 Windows 找到了它,Ant 也应该这样做。(否则,请在用户邮件列表中寻求帮助。)如果 Windows 无法执行该程序,请将该程序的目录添加到 PATHset PATH=%PATH%;dirOfProgram)或在构建文件中 executable 属性中指定绝对路径。

Cygwin 用户

<exec> 任务将无法理解 executable 参数的路径,例如 /bin/sh。这是因为 Ant 运行的 JVM 是标准 Windows 可执行文件,并且不了解 Cygwin 环境(即,不加载 cygwin1.dll)。解决此问题的唯一方法是在 Cygwin 下编译 JVM(风险自负)。例如,请参阅 cygwin 的 OpenJDK 构建说明

OpenVMS 用户

使用 executable<arg> 元素指定的命令在临时 DCL 脚本中按指定方式执行。这有一些含义

请注意,HP 提供的 JVM 不遵循 OpenVMS 的退出代码约定。如果您使用此任务运行 JVM,则该任务可能会错误地声称发生错误(或静默忽略错误)。不要使用此任务运行 JAVA.EXE,而应使用 fork 属性设置为 true<java> 任务,因为此任务将遵循 JVM 对退出代码的解释。

RedHat S/390 用户

linux-390 报道,通过 Ant Exec 任务调用的 shell 脚本必须指定其解释器,即,脚本必须以类似于以下内容开头

#!/bin/bash

否则任务将失败,如下所示

[exec] Warning: UNIXProcess.forkAndExec native error: Exec format error
[exec] Result: 255

在类 Unix 系统上将 Ant 作为后台进程运行

如果您将 Ant 作为后台进程运行(如 ant &),并使用 spawn 设置为 false<exec> 任务,您必须向派生进程提供明确的输入,否则 Ant 将被挂起,因为它尝试从标准输入中读取。

参数

属性 描述 必需
command 要执行的命令,带有所有命令行参数。已弃用,请改用 executable 和嵌套的 <arg> 元素 两者中必须有一个
executable 要执行的命令,没有任何命令行参数。
dir 应在其中执行命令的目录。 否;如果 vmlaunchertrue,则默认为当前工作目录,否则为项目的 basedir
os 可以在其上执行命令的操作系统列表。如果当前操作系统的名称包含在此列表中,则将执行该命令。操作系统的名称由 JVM 确定,并设置在 os.name 系统属性中。
osfamily <os> 条件中使用的操作系统系列。自 Ant 1.7 起
spawn 是否要派生命令
如果您派生一个命令,它的输出将不会被 Ant 记录。
在派生进程时,inputoutputerrorresult 属性设置不活动。
自 Ant 1.6 起
否;默认为 false
output 要将输出写入的文件的名称。如果错误流也没有重定向到文件或属性,它将出现在此输出中。
error 应将命令的标准错误重定向到的文件。自 Ant 1.6 起
logError 当您希望在 Ant 的日志中看到错误输出并且您将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果您使用 errorerrorProperty 属性重定向错误,这将不起作用。自 Ant 1.6 起
append 输出和错误文件是附加还是覆盖。 否;默认为 false
outputproperty 应将命令的输出存储在其中的属性的名称。除非错误流重定向到单独的文件或流,否则此属性将包括错误输出。
errorproperty 应将命令的标准错误存储在其中的属性的名称。自 Ant 1.6 起
input 执行命令的标准输入所取用的文件。此属性与 inputstring 属性互斥。自 Ant 1.6 起
inputstring 作为执行命令的输入流的字符串。此属性与 input 属性互斥。自 Ant 1.6 起
resultproperty 应将命令的返回代码存储在其中的属性的名称。仅当 failonerror=false 时才感兴趣。
timeout 如果命令在指定时间内(以毫秒为单位)没有完成,则停止该命令。
failonerror 如果命令退出时返回代码表示失败,则停止构建过程。 否;默认为 false
failifexecutionfails 如果无法启动程序,则停止构建。 否;默认为 true
newenvironment 在指定新环境变量时,不要传播旧环境。 否;默认为 false
vmlauncher 在可用时,使用 JVM 的执行设施运行命令。如果设置为 false,将使用底层操作系统的 shell,直接使用或通过 antRun 脚本使用。在某些操作系统下,这可以访问通常无法通过 JVM 访问的设施,包括在 Windows 下能够执行脚本,而不是其关联的解释器。如果您想将可执行文件的名称指定为相对于 dir 属性给出的目录的相对路径,可能还需要将 vmlauncher 设置为 false 否;默认为 true
resolveexecutable 当此属性为 true 时,可执行文件的名称首先针对项目 basedir 解析,如果不存在,则针对指定的执行目录解析。在 Unix 系统上,如果您只想允许执行用户路径中的命令,请将其设置为 false自 Ant 1.6 起 否;默认为 false
searchpath 当此属性为 true 时,在解析可执行文件的位置时,将搜索系统路径环境变量。自 Ant 1.6.3 起 否;默认为 false
discardOutput 是否应完全丢弃输出。此设置与将输出重定向到文件或属性的任何设置不兼容。
如果您将其设置为 true,错误输出也将被丢弃,除非您将错误输出重定向到文件、属性或启用 logError自 Ant 1.10.10 起
否;默认为 false
discardError 是否应完全丢弃错误输出。此设置与将错误输出重定向到文件或属性的任何设置以及 logError 不兼容。自 Ant 1.10.10 起 否;默认为 false

示例

<exec dir="${src}" executable="cmd.exe" os="Windows 2000" output="dir.txt">
  <arg line="/c dir"/>
</exec>

作为嵌套元素指定的参数

arg

命令行参数应指定为嵌套的 <arg> 元素。请参阅命令行参数

env

可以通过嵌套的 <env> 元素指定要传递给系统命令的环境变量。

属性 描述 必需
key 环境变量的名称。
注意自 Ant 1.7 起,对于 Windows,名称不区分大小写。
value 环境变量的文本值。 其中之一
path 类似于 PATH 的环境变量的值。您可以使用 ;: 作为路径分隔符,Ant 会将其转换为平台的本地约定。
file 环境变量的值。Ant 将用文件的绝对文件名替换它。

redirector

自 Ant 1.6.2 起

可以指定嵌套的I/O 重定向器。通常,重定向器的属性的行为与任务级别可用的相应属性相同。最显着的特点源于保留 <exec> 属性以实现向后兼容性。任何文件映射都使用 null 源文件完成;因此,并非所有映射器类型都会返回结果。当没有返回结果时,重定向规范将回退到任务级别属性。在实践中,这意味着可以为输入、输出和错误输出文件指定默认值。

错误和返回代码

默认情况下,<exec> 的返回代码会被忽略;当您将 failonerror 设置为 true 时,任何表示失败的返回代码(操作系统特定)都会导致构建失败。或者,您可以将 resultproperty 设置为某个属性的名称,并将其分配给结果代码(当然,除了不可变性)。

如果尝试启动程序失败并出现操作系统相关的错误代码,那么除非将 failifexecutionfails 设置为 false,否则 <exec> 会停止构建。您可以使用它来运行程序(如果存在),否则不执行任何操作。

这些错误代码是什么意思?嗯,它们取决于操作系统。在 Windows 计算机上,您必须查看 文档error=2 表示“没有此程序”,通常表示它不在路径中。任何时候您从任何 Ant 任务中看到此类错误,通常不是 Ant 错误,而是计算机上的一些配置问题。

示例

在 X 窗口系统的显示器 1 上启动 emacs

<exec executable="emacs">
  <env key="DISPLAY" value=":1.0"/>
</exec>

${basedir}/bin 添加到系统命令的 PATH 中。

<property environment="env"/>
<exec ... >
  <env key="PATH" path="${env.PATH}:${basedir}/bin"/>
</exec>

使用指定的 ${file} 启动 ${browser},并结束 Ant 进程。浏览器将保持打开状态。

<property name="browser" location="C:/Program Files/Internet Explorer/iexplore.exe"/>
<property name="file" location="ant/docs/manual/index.html"/>

<exec executable="${browser}" spawn="true">
    <arg value="${file}"/>
</exec>

使用 <inputfilterchain> 将字符串 blah before blah 发送到 cat 可执行文件,在输入时用 after 替换 before。输出将发送到文件 redirector.out 并存储在同名属性中。类似地,错误输出将发送到文件和属性,它们都名为 redirector.err

<exec executable="cat">
    <redirector outputproperty="redirector.out"
                errorproperty="redirector.err"
                inputstring="blah before blah">
        <inputfilterchain>
            <replacestring from="before" to="after"/>
        </inputfilterchain>
        <outputmapper type="merge" to="redirector.out"/>
        <errormapper type="merge" to="redirector.err"/>
    </redirector>
</exec>

注意:不要尝试使用简单的 arg 元素指定参数,并用空格分隔它们。这会导致只有一个包含整个字符串的参数。

超时:如果指定了超时,则在达到超时时间时,子进程将被终止,并向日志打印一条消息。执行的返回值将为 -1,如果 failonerror=true,则将停止构建,否则将被忽略。