|
- <html>
-
- <head>
- <meta http-equiv="Content-Language" content="en-us"></meta>
- <title>Script Task</title>
- </head>
-
- <body>
-
- <h2><a name="script">Script</a></h2>
- <h3>Description</h3>
- <p>Execute a script in a
- <a href="http://jakarta.apache.org/bsf" target="_top">Apache BSF</a> supported language.</p>
- <p><b>Note:</b> This task depends on external libraries not included in the Ant distribution.
- See <a href="../install.html#librarydependencies">Library Dependencies</a> for more information.</p>
- <p>All items (tasks, targets, etc) of the running project are
- accessible from the script, using either their <code>name</code> or
- <code>id</code> attributes (as long as their names are considered
- valid Java identifiers, that is).
- The name "project" is a pre-defined reference to the Project, which can be
- used instead of the project name. The name "self" is a pre-defined reference to the actual
- <code><script></code>-Task instance.<br/>From these objects you have access to the Ant Java API, see the
- <a href="../api/index.html">JavaDoc</a> (especially for
- <a href="../api/org/apache/tools/ant/Project.html">Project</a> and
- <a href="../api/org/apache/tools/ant/taskdefs/optional/Script.html">Script</a>) for more information.</p>
- <p>If you are using JavaScript a good resource is <a target="_blank" href="http://www.mozilla.org/rhino/doc.html">
- http://www.mozilla.org/rhino/doc.html</a> as we are using their JavaScript interpreter.</p>
- <p>Scripts can do almost anything a task written in Java could do.</p>
- <p>Rhino provides a special construct - the <i>JavaAdapter</i>. With that you can
- create an object which implements several interfaces, extends classes and for which you
- can overwrite methods. Because this is an undocumented feature (yet), here is the link
- to an explanation: <a href="http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&frame=right&th=610d2db45c0756bd&seekm=391EEC3C.5236D929%40yahoo.com#link2">
- Groups@Google: "Rhino, enum.js, JavaAdapter?"</a> by Norris Boyd in the newsgroup
- <i>netscape.public.mozilla.jseng</i>.</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">language</td>
- <td valign="top">The programming language the script is written in.
- Must be a supported Apache BSF language</td>
- <td valign="top" align="center">Yes</td>
- </tr>
- <tr>
- <td valign="top">src</td>
- <td valign="top">The location of the script as a file, if not inline</td>
- <td valign="top" align="center">No</td>
- </tr>
- </table>
- <h3>Examples</h3>
- The following snippet shows use of five different languages:
- <blockquote><pre>
- <property name="message" value="Hello world"/>
-
- <script language="groovy">
- println("message is " + message)
- </script>
-
- <script language="beanshell">
- System.out.println("message is " + message);
- </script>
-
- <script language="judoscript">
- println 'message is ', message
- </script>
-
- <script language="ruby">
- print 'message is ', $message, "\n"
- </script>
-
- <script language="jython">
- print "message is %s" % message
- </script>
- </pre>
- </blockquote>
- <p>
- Note that for the <i>jython</i> example, the script contents <b>must</b>
- start on the first column.
- </p>
- <p>
- The following script shows a little more complicated jruby example:
- </p>
- <blockquote><pre>
- <script language="ruby">
- xmlfiles = Dir.new(".").entries.delete_if { |i| ! (i =~ /\.xml$/) }
- xmlfiles.sort.each { |i| $self.log(i) }
- </script>
- </pre>
- </blockquote>
- <p>
- The same example in groovy is:
- </p>
- <blockquote><pre>
- <script language="groovy">
- xmlfiles = new java.io.File(".").listFiles().findAll{ it =~ "\.xml$"}
- xmlfiles.sort().each { self.log(it.toString())}
- </script>
- </pre>
- </blockquote>
- <p>
- The following script uses javascript to create a number of
- echo tasks and execute them.
- </p>
- <blockquote><pre>
- <project name="squares" default="main" basedir=".">
-
- <target name="main">
-
- <script language="javascript"> <![CDATA[
-
- for (i=1; i<=10; i++) {
- echo = squares.createTask("echo");
- echo.setMessage(i*i);
- echo.perform();
- }
-
- ]]> </script>
-
- </target>
-
- </project>
- </pre></blockquote>
- <p>generates</p>
- <blockquote><pre>
- main:
- 1
- 4
- 9
- 16
- 25
- 36
- 49
- 64
- 81
- 100
-
- BUILD SUCCESSFUL
- </pre></blockquote>
- <p>Another example, using <a href="../using.html#references">references by id</a>
- and two different scripting languages:</p>
- <blockquote><pre>
- <project name="testscript" default="main">
- <target name="sub">
- <echo id="theEcho"/>
- </target>
-
- <target name="sub1">
- <script language="netrexx"><![CDATA[
- theEcho.setMessage("In sub1")
- sub.execute
- ]]></script>
- </target>
-
- <target name="sub2">
- <script language="javascript"><![CDATA[
- theEcho.setMessage("In sub2");
- sub.execute();
- ]]></script>
- </target>
-
- <target name="main" depends="sub1,sub2"/>
- </project>
- </pre></blockquote>
- <p>generates</p>
- <blockquote><pre>
- sub1:
- In sub1
-
- sub2:
- In sub2
-
- main:
-
- BUILD SUCCESSFUL
- </pre></blockquote>
-
- <p>Now a more complex example using the Java API and the Ant API. The goal is to list the
- filesizes of all files a <code><fileset/></code> caught.</p>
- <blockquote><pre>
-
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <project name="<font color=blue>MyProject</font>" basedir="." default="main">
-
- <property name="fs.dir" value="src"/>
- <property name="fs.includes" value="**/*.txt"/>
- <property name="fs.excludes" value="**/*.tmp"/>
-
- <target name="main">
- <script language="javascript"> <![CDATA[
-
- // import statements
- <font color=blue>// importPackage(java.io)</font>;
- <font color=blue>importClass(java.io.File)</font>;
-
- // Access to Ant-Properties by their names
- dir = <font color=blue>project</font>.getProperty("fs.dir");
- includes = <font color=blue>MyProject</font>.getProperty("fs.includes");
- excludes = <font color=blue>self.getProject()</font> .<font color=blue>getProperty("fs.excludes")</font>;
-
- // Create a <fileset dir="" includes=""/>
- fs = project.<font color=blue>createDataType("fileset")</font>;
- fs.setDir( new File(dir) );
- <font color=blue>fs.setIncludes(includes)</font>;
- fs.setExcludes(excludes);
-
- // Get the files (array) of that fileset
- ds = fs.getDirectoryScanner(project);
- srcFiles = ds.getIncludedFiles();
-
- // iterate over that array
- for (i=0; i<srcFiles.length; i++) {
-
- // get the values via Java API
- var basedir = fs.getDir(project);
- var filename = srcFiles[i];
- var file = <font color=blue>new File(basedir, filename)</font>;
- var size = file.length();
-
- // create and use a Task via Ant API
- echo = MyProject.<font color=blue>createTask("echo")</font>;
- echo.setMessage(filename + ": " + size + " byte");
- echo.<font color=blue>perform()</font>;
- }
- ]]></script>
- </target>
- </project>
- </pre></blockquote>
- <p>We want to use the Java API. Because we don't want always typing the package signature
- we do an import. Rhino knows two different methods for import statements: one for packages
- and one for a single class. By default only the <i>java</i> packages are available, so
- <i>java.lang.System</i> can be directly imported with <code>importClass/importPackage</code>.
- For other packages you have to prefix the full classified name with <i>Packages</i>.
- For example Ant's <i>FileUtils</i> class can be imported with
- <code>importClass(<b>Packages</b>.org.apache.tools.ant.util.FileUtils)</code>
- <br>
- The <code><script></code> task populates the Project instance under
- the name <i>project</i>, so we can use that reference. Another way is to use its given name
- or getting its reference from the task itself.<br>
- The Project provides methods for accessing and setting properties, creating DataTypes and
- Tasks and much more.<br>
- After creating a FileSet object we initialize that by calling its set-methods. Then we can
- use that object like a normal Ant task (<code><copy></code> for example).<br>
- For getting the size of a file we instantiate a <code>java.io.File</code>. So we are using
- normal Java API here.<br>
- Finally we use the <code><echo></code> task for producing the output. The task is not executed by
- its execute() method, because the perform() method (implemented in Task itself) does the
- appropriate logging before and after invoking execute().
- </p>
-
-
- <hr>
- <p align="center">Copyright © 2000-2004 The Apache Software Foundation. All rights
- Reserved.</p>
-
- </body>
- </html>
|