使用过ant的人都知道,ant是无法捕获构建过程中抛出的异常的,确切的说,是无法拦截异常并由用户手动处理的(参考java语言的try-catch语句)。
ant算是一门经典的构建工具了,在maven出现以前,ant的霸主地位一直未被动摇。现在虽然maven抢过了ant的风头,但ant在某些操作上还是maven无法比拟的,例如文件操作、执行远程命令等。
公司项目中使用了maven来进行构建,但每次部署时(这里不讨论jenkins),都需要手动打包,拷贝文件到远程web容器,然后清楚web容器缓存文件,最后启动web容器(如果有人对我说热部署,我只能以呵呵回报他)。这一系列操作,恩,来个十次八次的就知道多繁琐了。
所以自己考虑使用ANT来进行这些操作,具体的一些细节就不讨论了,只说其中出现的引起大麻烦的“小问题”。
自己为了方便,都是直接把ant构建添加在鼠标右键的,这要只需要在需要构建的build.xml文件上鼠标右键即可。但是唯一美中不足的地方就是如果构建过程中出现了异常,我是没办法知道的,因为构建过程是在命令行中一闪而过的,之前自己翻阅了ant的API文档,才知道ant是没办法手动捕获异常的。
于是又一次有一个同事自己偷偷把maven打包生成的文件名字改了,我也不知道,在每次调试的时候继续使用ant打包,打包,打包(其实每次ant构建都是失败的)。然后发现一个代码上的问题明明解决了,但是在服务器上居然还存在相应的bug,查来查去才发现是自己一直没有把最新的代码部署上去。
自己的思路就是在ant构建失败时,能停止构建,并在命令行中弹出“构建异常,按ENTER继续”这样的需要用户接介入的操作,而构建成功时就不显示任何信息。
通过再三搜索,终于找到了一个第三方的task:ant-contrib,需要的jar是:ant-contrib-1.0b3.jar。这个文件可以在maven的中央仓库找到。
下载下来后,为了方便,可以直接将此jar放到$ANT_HOME/lib 下。
下面是一个使用此task的demo,demo中手动抛出了一个异常,然后拦截了异常并提示“构建异常,按ENTER继续”:
<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<projectname="auto_test" basedir="."default="autotest.main">
<!--在ant脚本目录下,新建一个lib目录,把ant-contrib-1.0b3.jar放在里面 -->
<taskdefresource="net/sf/antcontrib/antcontrib.properties" />
<targetname="autotest.main">
<trycatch property="GetBuildError" >
<try >
<!--****************我的任务**************************** -->
<fail>这是一个手动抛出的异常</fail>
<!--****************我的任务**************************** -->
</try>
<catch>
<echo level="error">构建错误,按Enter结束</echo>
<echolevel="error">${GetBuildError}</echo>
<input />
</catch>
</trycatch>
</target>
</project>
构建过程如下:
可以看到,ant拦截到了异常并等待用户来处理。这样就不怕构建失败时不被发现了。