blob: 6a29b2fe5448becb7141e037deb42b7fa8ada0b3 [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Exec Task</title>
</head>
<body>
<h2><a name="exec">Exec</a></h2>
<h3>Description</h3>
<p>Executes a system command. When the <i>os</i> attribute is specified, then
the command is only executed when Ant is run on one of the specified operating
systems.</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
<td valign="top"><b>Attribute</b></td>
<td valign="top"><b>Description</b></td>
<td align="center" valign="top"><b>Required</b></td>
</tr>
<tr>
<td valign="top">command</td>
<td valign="top">the command to execute with all command line
arguments. <b>deprecated, use executable and nested
<code>&lt;arg&gt;</code> elements instead</b>.</td>
<td align="center" rowspan="2">Exactly one of the two.</td>
</tr>
<tr>
<td valign="top">executable</td>
<td valign="top">the command to execute without any command line
arguments.</td>
</tr>
<tr>
<td valign="top">dir</td>
<td valign="top">the directory in which the command should be executed.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">os</td>
<td valign="top">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 the Java Virtual machine and is set
in the &quot;os.name&quot; system property.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">output</td>
<td valign="top">the file to which the output of the command should be
redirected.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">append</td>
<td valign="top">whether output should be appended to or overwrite
an existing file. Defaults to false.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">outputproperty</td>
<td valign="top">the name of a property in which the output of the
command should be stored.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">resultproperty</td>
<td valign="top">the name of a property in which the return code of the
command should be stored. Only of interest if failonerror=false</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">timeout</td>
<td valign="top">Stop the command if it doesn't finish within the
specified time (given in milliseconds).</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">failonerror</td>
<td valign="top">Stop the buildprocess if the command exits with a
returncode other than 0. Defaults to false</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">failifexecutionfails</td>
<td valign="top">Stop the build if we can't start the program.
Defaults to true. </td>
<td align="center" valign="top">No</td>
</tr> <tr>
<td valign="top">newenvironment</td>
<td valign="top">Do not propagate old environment when new environment
variables are specified.</td>
<td align="center" valign="top">No, default is <i>false</i></td>
</tr>
<tr>
<td valign="top">vmlauncher</td>
<td valign="top">Run command using the Java VM's execution facilities
where available. If set to false the 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 the VM 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
false as well.</td>
<td align="center" valign="top">No, default is <i>true</i></td>
</tr>
</table>
<h3>Examples</h3>
<blockquote>
<pre>
&lt;exec dir=&quot;${src}&quot; executable=&quot;cmd.exe&quot; os=&quot;Windows 2000&quot; output=&quot;dir.txt&quot;&gt;
&lt;arg line=&quot;/c dir&quot;/&gt;
&lt;/exec&gt;</pre>
</blockquote>
<h3>Parameters specified as nested elements</h3>
<h4>arg</h4>
<p>Command line arguments should be specified as nested
<code>&lt;arg&gt;</code> elements. See <a
href="../using.html#arg">Command line arguments</a>.</p>
<h4><a name="env">env</a></h4>
<p>It is possible to specify environment variables to pass to the
system command via nested <code>&lt;env&gt;</code> elements.</p>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
<td valign="top"><b>Attribute</b></td>
<td valign="top"><b>Description</b></td>
<td align="center" valign="top"><b>Required</b></td>
</tr>
<tr>
<td valign="top">key</td>
<td valign="top">The name of the environment variable.</td>
<td align="center" valign="top">Yes</td>
</tr>
<tr>
<td valign="top">value</td>
<td valign="top">The literal value for the environment variable.</td>
<td align="center" rowspan="3">Exactly one of these.</td>
</tr>
<tr>
<td valign="top">path</td>
<td valign="top">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.</td>
</tr>
<tr>
<td valign="top">file</td>
<td valign="top">The value for the environment variable. Will be
replaced by the absolute filename of the file by Ant.</td>
</tr>
</table>
<h3>Errors and return codes</h3>
By default the return code of a &lt;exec&gt; is ignored; when you set
<code>failonerror="true"</code> then any non zero response is treated as an
error. Alternatively, you can set <code>resultproperty</code> to the name
of a property and have it assigned to the result code (barring immutability,
of course).
<p>
If the attempt to start the program fails with an OS dependent error code,
then &lt;exec&gt; halts the build unless <code>failifexecutionfails</code>
is set. You can use that to run a program if it exists, but otherwise
do nothing.
<p>
What do those error codes mean? Well, they are OS dependent. On Windows
boxes you have to look in include\error.h in your windows compiler or wine files;
error code 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.
<h3>Examples</h3>
<blockquote><pre>
&lt;exec executable=&quot;emacs&quot; &gt;
&lt;env key=&quot;DISPLAY&quot; value=&quot;:1.0&quot;/&gt;
&lt;/exec&gt;
</pre></blockquote>
<p>starts <code>emacs</code> on display 1 of the X Window System.</p>
<blockquote><pre>
&lt;exec ... &gt;
&lt;env key=&quot;PATH&quot; path=&quot;${java.library.path}:${basedir}/bin&quot;/&gt;
&lt;/exec&gt;
</pre></blockquote>
<p>adds <code>${basedir}/bin</code> to the <code>PATH</code> of the
system command.</p>
<p><b>Note:</b> Although it may work for you to specify arguments using
a simple arg-element and separate them by spaces it may fail if you switch to
a newer version of the JDK. JDK &lt; 1.2 will pass these as separate arguments
to the program you are calling, JDK &gt;= 1.2 will pass them as a single
argument and cause most calls to fail.</p>
<p><b>Note2:</b> If you are using Ant on Windows and a new DOS-Window pops up
for every command which is executed this may be a problem of the JDK you are using.
This problem may occur with all JDK's &lt; 1.2.</p>
<p>
<b>Timeouts: </b> 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
<tt>failonerror=true</tt>, but be ignored otherwise.
<hr>
<p align="center">Copyright &copy; 2000-2002 Apache Software Foundation. All rights
Reserved.</p>
</body>
</html>