一般来说。ant的任务都是要写一个build.xml文件,然后删删改改,最后运行ant target。这自是正途。但是有时候,如果你需要的就是简单试验一下某个task,或者就想拿某个ant task当成shell命令的话,就不方便了。

在Neptune这个工具里面,附带了一个shell。这个shell允许交互执行Neptune的Command和Ant的Task。可以在这里下载:
http://docs.codehaus.org/display/JASKELL/Downloads

下面简要介绍一下怎么用:

启动Neptune shell很简单。按照要求安装完了之后(就是设置一个NEPTUNE_HOME和PATH环境变量),运行:
np -i

shell启动后,你可以看见:
Neptune Interactive
>
这个">"是命令提示符。现在你可以输入命令了。

先看看最简单的ant echo任务。xml语法是这样的:
<echo message="hello world"/>
对应的neptune语法是
> ant.echo{message="hello world"}->exec
>
starting command Echo ...
task Echo: hello world
command Echo executed.

稍微解释一下:
1。所有ant命令都在ant这个namespace里面。
2。xml的尖括号换成大括号。大括号在jaskell语言里面表示一个tuple。
3。exec函数用来执行一个命令。如果没有exec,ant.echo只是生成一个命令对象,但不执行。这样做得好处是,你可以用变量临时存储这些命令对象,可以把他们存在任意的对象或者数组中,等到真正需要执行的时候再运行。
4。"->"这个函数用来以先参数后函数的循序调用函数,相当于exec(ant.echo{...}),语法上有的时候显得更漂亮些。



再来看个复杂点的。前两天我发现需要把某个目录下所有反编译出来的jad文件改名成java文件。dos的rename命令居然不支持。于是我就祭起法宝:
> rename {dir,from,to} = ant.move{todir=dir}.with [
>   ant.types.fileset{dir}.with [
>     ant.types.include{name="**/$from"}
>   ],
>   ant.types.mapper{type="glob",from,to}
> ] ->exec
>
=> rename()

这个东西定义了一个函数,接下来,我就可以拿rename当作一个简洁的命令了:
> rename{dir="decompiled",from="*.jad",to="*.java"}
> 
starting command Move
command Move executed.
>


后来,我把这个rename函数稍微完善了一下,增加了一个recursive参数来控制是否处理子目录,缺省值是false,给dir设置当前目录为缺省值。代码放在一个可以重用的脚本文件里面。现在可以这样做了。先把函数加载进来:

> helper = import {resource="jfun/neptune/ant/anthelper.jsl"}
>


然后调用:
> helper.rename{from="*.jad",to="*.java",recursive=true}->exec
>

呵呵。

这个工具可以调用任意的ant任务。还有很多好用的函数。具体请见:
http://docs.codehaus.org/display/JASKELL/Neptune