Executes a system command. When the os attribute is specified, then the command is only executed when Apache Ant is run on one of the specified operating systems.
Note that you cannot interact with the forked program, the only way to send input to it is via
the input and inputstring attributes. Also note that since Ant 1.6, any attempt to read
input in the forked program will receive an EOF (-1
). This is a change from Ant 1.5, where
such an attempt would block.
If you want to execute an executable using a path relative to the project's basedir,
you may need to use vmlauncher=false
on some operating systems—but even this
may fail (Solaris 8/9 has been reported as problematic). The resolveexecutable attribute
should be more reliable, as would be something like
<property name="executable-full-path" location="../relative/path/to/executable"/> <exec executable="${executable-full-path}" ...
The <exec>
task delegates to Runtime.exec
which in turn
apparently
calls ::CreateProcess
. It is the latter Win32 function that defines the
exact semantics of the call. In particular, if you do not put a file extension on the executable,
only .EXE files are looked for, not .COM, .CMD or other file
types listed in the environment variable PATHEXT
. That is only used by the shell.
Note that .bat files cannot in general by executed directly. One normally needs to execute the command shell executable cmd using the /c switch.
<target name="help"> <exec executable="cmd"> <arg value="/c"/> <arg value="ant.bat"/> <arg value="-p"/> </exec> </target>
A common problem is not having the executable on the PATH
. In case you get an error
message Cannot run program "...":CreateProcess error=2. The system cannot find
the path specified.
have a look at your PATH
variable. Just type the command
directly on the command line and if Windows finds it, Ant should do it too. (Otherwise ask on the
user mailinglist for help.) If Windows can not execute the program, add the directory of the program
to the PATH
(set PATH=%PATH%;dirOfProgram
) or specify the absolute path in
the executable attribute in your buildfile.
The <exec>
task will not understand paths such as /bin/sh
for
the executable parameter. This is because JVM in which Ant is running is a standard
Windows executable and is not aware of the Cygwin environment (i.e., doesn't
load cygwin1.dll). The only work-around for this is to compile a JVM under Cygwin (at
your own risk). See for
instance OpenJDK build instructions for cygwin.
The command specified using executable and <arg>
elements is
executed exactly as specified inside a temporary DCL script. This has some implications:
@-sign (e.g. executable=
@[FOO]BAR.COM), just as you would in a DCL script
Please note that JVM provided by HP doesn't follow OpenVMS' conventions of exit codes. If you
run a JVM with this task, the task may falsely claim that an error occurred (or silently ignore an
error). Don't use this task to run JAVA.EXE, use a <java>
task with
the fork attribute set to true
instead as this task will follow the JVM's
interpretation of exit codes.
It has been reported on linux-390 that shell scripts invoked via the Ant Exec task must have their interpreter specified, i.e., the scripts must start with something like:
#!/bin/bash
or the task will fail as follows:
[exec] Warning: UNIXProcess.forkAndExec native error: Exec format error [exec] Result: 255
If you run Ant as a background process (like ant &) and use
the <exec>
task with spawn set to false
, you must provide
explicit input to the forked process or Ant will be suspended because it tries to read from the
standard input.
Attribute | Description | Required |
---|---|---|
command | the command to execute with all command line arguments. Deprecated,
use executable and nested <arg> elements instead. |
Exactly one of the two |
executable | the command to execute without any command line arguments. | |
dir | the directory in which the command should be executed. | No; if vmlauncher is true, defaults to the current working directory, otherwise the project's basedir |
os | list of Operating Systems on which the command may be executed. If the current OS's name is
contained in this list, the command will be executed. The OS's name is determined by JVM and
is set in the os.name system property.
|
No |
osfamily | OS family as used in the <os> condition. since Ant 1.7 |
No |
spawn | whether or not you want the command to be spawned If you spawn a command, its output will not be logged by Ant. The input, output, error, and result property settings are not active when spawning a process. since Ant 1.6 |
No; default is false |
output | Name of a file to which to write the output. If the error stream is not also redirected to a file or property, it will appear in this output. | No |
error | The file to which the standard error of the command should be redirected. since Ant 1.6 | No |
logError | This attribute is used when you wish to see error output in Ant's log and you are redirecting output to a file/property. The error output will not be included in the output file/property. If you redirect error with the error or errorProperty attributes, this will have no effect. since Ant 1.6 | No |
append | Whether output and error files should be appended to or overwritten. | No; defaults to false |
outputproperty | The name of a property in which the output of the command should be stored. Unless the error stream is redirected to a separate file or stream, this property will include the error output. | No |
errorproperty | The name of a property in which the standard error of the command should be stored. since Ant 1.6 | No |
input | A file from which the executed command's standard input is taken. This attribute is mutually exclusive with the inputstring attribute. since Ant 1.6 | No |
inputstring | A string which serves as the input stream for the executed command. This attribute is mutually exclusive with the input attribute. since Ant 1.6 | No |
resultproperty | the name of a property in which the return code of the command should be stored. Only of
interest if failonerror=false. |
No |
timeout | Stop the command if it doesn't finish within the specified time (given in milliseconds). | No |
failonerror | Stop the build process if the command exits with a return code signaling failure. | No; defaults to false |
failifexecutionfails | Stop the build if we can't start the program. | No; defaults to true |
newenvironment | Do not propagate old environment when new environment variables are specified. | No; default is false |
vmlauncher | Run command using the JVM's execution facilities where available. If set to falsethe underlying OS's shell, either directly or through the antRun scripts, will be used. Under some operating systems, this gives access to facilities not normally available through JVM including, under Windows, being able to execute scripts, rather than their associated interpreter. If you want to specify the name of the executable as a relative path to the directory given by the dir attribute, it may become necessary to set vmlauncher to falseas well. |
No; default is true |
resolveexecutable | When this attribute is true, the name of the executable is resolved firstly against the project basedir and if that does not exist, against the execution directory if specified. On Unix systems, if you only want to allow execution of commands in the user's path, set this to false. since Ant 1.6 |
No; default is false |
searchpath | When this attribute is true, then system path environment variables will be searched when resolving the location of the executable. since Ant 1.6.3 |
No; default is false |
discardOutput | Whether output should completely be discarded. This setting is
incompatible with any setting that redirects output to files or
properties. If you set this to trueerror output will be discared as well unless you redirect error output to files, properties or enable logError. Since Ant 1.10.10 |
No; defaults to false |
discardError | Whether error output should completely be discarded. This
setting is incompatible with any setting that redirects error
output to files or properties as well as logError. Since Ant 1.10.10 |
No; defaults to false |
<exec dir="${src}" executable="cmd.exe" os="Windows 2000" output="dir.txt"> <arg line="/c dir"/> </exec>
Command line arguments should be specified as nested <arg>
elements. See Command line arguments.
It is possible to specify environment variables to pass to the system command via
nested <env>
elements.
Attribute | Description | Required |
---|---|---|
key | The name of the environment variable. Note: since Ant 1.7, for Windows, the name is case-insensitive. |
Yes |
value | The literal value for the environment variable. | Exactly one of these |
path | The value for a PATH -like environment variable. You can
use ;or :as path separators and Ant will convert it to the platform's local conventions. |
|
file | The value for the environment variable. Will be replaced by the absolute filename of the file by Ant. |
A nested I/O Redirector can be specified. In general, the
attributes of the redirector behave as the corresponding attributes available at the task level.
The most notable peculiarity stems from the retention of the <exec>
attributes
for backwards compatibility. Any file mapping is done using a null
sourcefile;
therefore not allMapper types will return results. When no
results are returned, redirection specifications will fall back to the task level attributes. In
practice this means that defaults can be specified for input, output, and error output files.
By default the return code of a <exec>
is ignored; when you
set failonerror to true
then any return code signaling failure (OS specific)
causes the build to fail. Alternatively, you can set resultproperty to the name of a
property and have it assigned to the result code (barring immutability, of course).
If the attempt to start the program fails with an OS dependent error code,
then <exec>
halts the build unless failifexecutionfails is set
to false
. You can use that to run a program if it exists, but otherwise do nothing.
What do those error codes mean? Well, they are OS dependent. On Windows boxes you have to look
at the documentation; error=2
means 'no such program', which usually
means it is not on the path. Any time you see such an error from any Ant task, it is usually not an
Ant bug, but some configuration problem on your machine.
Start emacs on display 1 of the X Window System.
<exec executable="emacs"> <env key="DISPLAY" value=":1.0"/> </exec>
Add ${basedir}/bin to the PATH
of the system command.
<property environment="env"/> <exec ... > <env key="PATH" path="${env.PATH}:${basedir}/bin"/> </exec>
Start the ${browser} with the specified ${file} and end the Ant process. The browser will remain.
<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>
Send the string blah before blah
to the cat executable, using
an <inputfilterchain> to replace before
with after
on the way in. Output is sent to the file redirector.out and stored
in a property of the same name. Similarly, error output is sent to a file and a property, both
named 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>
Note: do not try to specify arguments using a simple arg
-element
and separate them by spaces. This results in only a single argument containing the entire
string.
Timeouts: If a timeout is specified, when it is reached the sub process is
killed and a message printed to the log. The return value of the execution will be -1
, which
will halt the build if failonerror=true
, but be ignored otherwise.