执行系统命令。当指定 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}" ...
<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 无法执行该程序,请将该程序的目录添加到 PATH
(set PATH=%PATH%;dirOfProgram
)或在构建文件中 executable 属性中指定绝对路径。
<exec>
任务将无法理解 executable 参数的路径,例如 /bin/sh
。这是因为 Ant 运行的 JVM 是标准 Windows 可执行文件,并且不了解 Cygwin 环境(即,不加载 cygwin1.dll)。解决此问题的唯一方法是在 Cygwin 下编译 JVM(风险自负)。例如,请参阅 cygwin 的 OpenJDK 构建说明。
使用 executable 和 <arg>
元素指定的命令在临时 DCL 脚本中按指定方式执行。这有一些含义
@符号(例如 executable=
@[FOO]BAR.COM),就像在 DCL 脚本中一样
请注意,HP 提供的 JVM 不遵循 OpenVMS 的退出代码约定。如果您使用此任务运行 JVM,则该任务可能会错误地声称发生错误(或静默忽略错误)。不要使用此任务运行 JAVA.EXE,而应使用 fork 属性设置为 true
的 <java>
任务,因为此任务将遵循 JVM 对退出代码的解释。
据 linux-390 报道,通过 Ant Exec 任务调用的 shell 脚本必须指定其解释器,即,脚本必须以类似于以下内容开头
#!/bin/bash
否则任务将失败,如下所示
[exec] Warning: UNIXProcess.forkAndExec native error: Exec format error [exec] Result: 255
如果您将 Ant 作为后台进程运行(如 ant &),并使用 spawn 设置为 false
的 <exec>
任务,您必须向派生进程提供明确的输入,否则 Ant 将被挂起,因为它尝试从标准输入中读取。
属性 | 描述 | 必需 |
---|---|---|
command | 要执行的命令,带有所有命令行参数。已弃用,请改用 executable 和嵌套的 <arg> 元素。 |
两者中必须有一个 |
executable | 要执行的命令,没有任何命令行参数。 | |
dir | 应在其中执行命令的目录。 | 否;如果 vmlauncher 为 true,则默认为当前工作目录,否则为项目的 basedir |
os | 可以在其上执行命令的操作系统列表。如果当前操作系统的名称包含在此列表中,则将执行该命令。操作系统的名称由 JVM 确定,并设置在 os.name 系统属性中。 |
否 |
osfamily | 在 <os> 条件中使用的操作系统系列。自 Ant 1.7 起 |
否 |
spawn | 是否要派生命令 如果您派生一个命令,它的输出将不会被 Ant 记录。 在派生进程时,input、output、error 和 result 属性设置不活动。 自 Ant 1.6 起 |
否;默认为 false |
output | 要将输出写入的文件的名称。如果错误流也没有重定向到文件或属性,它将出现在此输出中。 | 否 |
error | 应将命令的标准错误重定向到的文件。自 Ant 1.6 起 | 否 |
logError | 当您希望在 Ant 的日志中看到错误输出并且您将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果您使用 error 或 errorProperty 属性重定向错误,这将不起作用。自 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>
元素。请参阅命令行参数。
可以通过嵌套的 <env>
元素指定要传递给系统命令的环境变量。
属性 | 描述 | 必需 |
---|---|---|
key | 环境变量的名称。 注意:自 Ant 1.7 起,对于 Windows,名称不区分大小写。 |
是 |
value | 环境变量的文本值。 | 其中之一 |
path | 类似于 PATH 的环境变量的值。您可以使用 ;或 :作为路径分隔符,Ant 会将其转换为平台的本地约定。 |
|
file | 环境变量的值。Ant 将用文件的绝对文件名替换它。 |
可以指定嵌套的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
,则将停止构建,否则将被忽略。