可爱的Ant——利用Ant获取文件列表

        提到Ant,你一定会想到它在自动构建方面有着举足轻重的地位,于我而言,也仅仅是将其作为一个自动构建的工具来使用。由于各个流行的IDE都内部集成了对Ant的强大支持,因此,我使用Ant的方式就真的简单得不能再简单了:在网上找一个build file,然后针对自己的project稍 作修改。这样,我就可以在IDE窗口中拖动鼠标点两下,就可以很方便地完成 project的构建了。真的太简便了,简便得让我忽略了Ant的其他强大功能。不过,是金子总会发光的。这两天,我切实地体会到了Ant不仅仅可以极好地完成自动构建的工作,而且它还是一个十分顺手的工具,极大地提高工作效率。
        事情的缘由是这样。Leader交给我了一项工作:在一个folder下面有很多以portlet结尾的文件,第一项任务就是要得到这些文件的列表;然 后呢,在另外一个PageControlList. java文件中有一个Object[][]类型的变量,里面就应该装着这些文件的名字。第二项任务就是根据文件列表 中的文件名在这个Object[][]变量中进行搜索,找出还有哪些文件名没有加入到这个变量中。 好了,工作任务就讲完了,是不是很简单呢?完全可 以利用IDE的搜索功能一个一个去找的,不过这样做就真的是体力活了。如果Leader让我过一段时间在检查一遍,我不拿头撞墙才怪呢。看来是得找 自动化一点的办法了。我一开始想到的就是自己写一段代码来搞定,但是面对着文件的操作就让人心烦。如果用Python的话,则无法利用那个 PageControlList中的方法直接得到那个Object[][]的变量,又得自己写代码去找,真的划不来。正当我郁闷于无从下手的时候,我想起了Ant ,想起了常用的build file中可以很简单地获得一个folder下面的文件,还可以轻松地对文件进行filter!好,就用它了。
        由于需要完成的工作比较特殊,使用Ant本身自带的task是没有办法完成的,需要写一个自定义的task。写自定义的task也是很简单的,只要 extend Ant的Task类,改写execute方法即可。我把自定义的task的名字定为list,大致的代码轮廓如下:

ExpandedBlockStart.gifContractedBlock.gifpublic class List extends Task dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void execute() dot.gifdot.gif }    
ExpandedBlockEnd.gif}
 None.gif

而在相应的XML文件中,通过taskdef引用这个自定义task,就可以在target中使用了。

None.gif<property name="prjroot" location="D:/fantasysoft/project" />
None.gif
<property name="src.dir" location="${prjroot}/src/java" />
None.gif
<property name="classes.dir" location="${prjroot}\web\WEB-INF\classes" />
None.gif
<property name="commonroot" location="${prjroot}/common/" />
None.gif    
None.gif
<target name="declare">
None.gif    
<taskdef name="list" classname="anttask.List" classpath="${classes.dir}" />
None.gif
</target>
None.gif
<target name="Check" depends="declare">
None.gif   
<list>
None.gif      dot.gif
None.gif   
</list>
None.gif
</target>
 
定好了这个框架以后,就要考虑这个task需要什么样的参数了。由于是对文件的操作,FileSet(FileSet是Ant中定义的类型,实质是文件的集合) 是必须的了,我们的check的target就会扩充成这样:

None.gif<target name="Check" depends="declare">
None.gif    
<list>
None.gif       
<fileset dir="${commonroot}" casesensitive="yes">
None.gif           
<include name="**/*Portlet.xml"/>
None.gif       
</fileset>
None.gif    
</list>       
None.gif
</target> None.gif

为了在List中获得fileset,我们就得在List中增加一个Vector类型的变量装fileset。

None.gifprivate Vector filesets = new  Vector();    
ExpandedBlockStart.gifContractedBlock.gif
public void addFileset(FileSet fileset) dot.gif {
InBlock.gif    filesets.add(fileset);
ExpandedBlockEnd.gif}

由于FileSet类型提供了很简便的方法获得文件列表,整个任务就变得十分简单了。 我们在execute方法中增加相应的处理代码:

ExpandedBlockStart.gifContractedBlock.gifpublic void execute() dot.gif {
InBlock.gif    String[] includedFiles 
= null;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (Iterator iterator = filesets.iterator(); iterator.hasNext();) dot.gif{
InBlock.gif        FileSet fs 
= (FileSet) iterator.next();
InBlock.gif        DirectoryScanner ds 
= fs.getDirectoryScanner(getProject());
InBlock.gif        includedFiles 
= ds.getIncludedFiles();
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    dot.gif
ExpandedBlockEnd.gif}
None.gif

在以上代码中,includedFiles这个字符串数组里存放着我需要的文件列表。让我头痛的文件列表操作的问题就这样轻松解决了,接下来的比较工作就是小菜一碟了。
        感谢可爱的小蚂蚁,是它让我在无聊的工作中找到了一点点满足的乐趣。 :)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值