The Ant’s Story

类别:Java 点击:0 评论:0 推荐:

 

Translate by guipei 200501

 

       Ant 工具估计应该不少朋友都在使用,ant也是一个不经意而成功的一个工具。它本身是为了方便tomcat项目编译出现的,最终的用户数量却远远大于了tomcat的用户,在整个的java社区广为应用。你知道它背后的故事么,这个故事来源于ant的原始发起人James Duncan Davidson的讲述,来让我们一起来了解一下吧。

 

       我必须承认我对Ant没有什么更多的想法,仅仅一个小小构建工具,可以走得这么远以及被众多的java社区的开发人员所使用。当我编写ant的第一个版本时候,它只是一个简单的工具用来帮助我解决跨平台的编译问题。现在它已经快速的成长,被成千上万的开发者用在不同的项目当中。这后面有什么魔力呢?这个小程序被众多的人们使用?也许ant来历的故事可以提供一些线索。

在ant被纳入Apache的cvs服务前,ant已经有了相当长的开发时间。在1998年中期,我在sun任职,当时负责创建java servlet2.1规范,以及涉及其实现的工作。这个实现的规范,就是后来的Tomcat,和以前的实现相比较,这是一个全新的系统,所以其实现必须是100%的纯java应用。为了取得100%的纯java认证,我们使用sun的java平台工作。你必须给Key Labs(一个中立的认证公司)证明它可以运行在三种不同的系统平台。为了证明servelt 规范的实现可以运行在任何的地方,我选择了Solaris,Windows,和Mac 系统。然而我不仅仅想实现tomcat在不同的平台上面运行,而且还想让它可以在不同的平台上面构建和开发。我曾经试用过GNU Make工具,和系统脚本以及批处理操作。然而天知道怎么回事,不同的方式都存在不同的问题。所有的问题都可能来自于我所使用的工具使用C语言开发的。当使用它们在java方面的应用时候,可以工作,但是非常的慢。尽管java程序可以很好的实现,但是虚拟机的启动太过耗时。并且使用Make会在每一个java编译的时候创建一个虚拟几。编译一个项目的时间随着项目文件的增多,编译时间则直线上升。

我试验了很多方法来编写make 文件,来解决应该使用一个javac来编译项目中的不同源文件。但是,不管我如何努力尝试,如何多次的使用Make向导,我没有得到方法最终解决一个虚拟机编译的问题。另外,让我感到非常累的时处理make文件中的tab格式。后来我对Emacs提出过建议,希望它可以解决无意创建的空格字符。

       在一次去参加欧洲会议的飞行中,我最终无法忍受创建需要运行的不同环境的不同的make文件。我开始决定开发自己的工具:可以检查一个项目中的所有源文件,比较它们最新的编译文件是否存在,然后直接调用javac编译新的java源文件。另外,它应该具有可以把一些类文件打包到一个java文件,以及可以选择复制一些文件的功能,满足不同的软件发布版本。为了确保这些事情可以工作在不同的平台上面,我决定使用java编写这个工具。    几个小时候,我有了一个可以这样运行的工具。它相当的简单,甚至有些粗遭,仅仅有几个类文件组成。我使用java.util.Properties功能实现数据层操作,而且它可以完美的工作。我的编译时间有了数量级的减少。当我返回之后,我在Solaris、Linux以及Mac系统上面做了测试,一切都非常完美。那个时候最大的问题时它仅仅有几个简单有限的功能,例如编译、复制一些文件-然而这正是它的核心功能。

在我展示这个工具的几个星期后,我命名这个工具为ant,因为这个小东西可以做大的事情。我的朋友Jason Hunter(o’reilly的servlet程序作家),他认为这是一个十分有用的工具,但也没能预料到它后来的发展。后来,我想到使用java反射功能提供一个简单的方法来扩展ant的能力,以便于程序员自己可以开发他们自己的任务来扩展它。事情开始发展,我有了第一个用户。Jason总是拥有特殊的能力发现软件中的bug,帮助我修复了其中的不少问题。

在反射功能实现以后,我又编写了更多的一些任务,ant在sun成为了一个相当有用的工具。然而,随着build文件不断变大,随着目标(任务的集合)功能的引入,属性文件不能很好的实现层次功能。我尝试着使用不同的方法解决这个问题,在一次欧洲返回的飞行中突然找到方法。就是使用XML文档的层次结构。其中也用到了以前实现XML标记解析的经验。

最终在海洋上空的飞行过程中我很好的完成了代码工作。我非常惊奇是否在高空中会增加我的能力帮助我完成任务,或者欧洲旅行给我带来了更大的创造力。更多的试验也许可以知道最终的结果。

Ant,象我们知道的一样,就这样诞生了。你现在看到的ant版本(好的或许坏的)就是来自当时的那个决定。当然,目前ant已经有了很大的改变,但是原理还是那样。在2000年后期,ant被纳入apache的tomcat旁边cvs资源库。我后来转移到其他的工作上去,主要集中在apache软件基金会的XML规范,例如sun的JAXP,以及w3c的DOM。

很让人吃惊,很多人们都在讨论Ant。第一次人们发现它工作在tomcat下面。然后它们告诉它们的朋友,然后朋友又告诉他们的朋友,等等。一些时间后,人们知道它,使用他的人竟然多于了Tomcat。一些强大的开发人员和用户社区在apache的ant下面开始成长,这个工具沿着这条路也做了很多修改。人们使用它构建各种不同的项目,从小的应用程序到巨大J2EE系统。

在2001年的JavaOne大会上,我知道了ant进入了正规发展。当时我在演示一个新的数据库开发工具,一个推荐者展示了使用设计软件在方框之间画线有多么简单。随着控制窗口的闪过,ant的每一个用户熟悉的显示过程,完整的完成了任务。我被深深的震惊了。

Ant的用户数量继续在增长。这全部都来自当时我的一个小小渴望,现在被世界上的所有java程序员所共享。也不不仅仅时java开发员,我最近以外发现了NAnt,一个Ant的.NET实现。如果我只到ant能够取得今天的巨大成功,我也许会花更多的时间,使它更加完美,更加复杂比当时发布。然而可能在易用性上面就会失败。也许ant会变得过于机械。如果我花费更多的时间让他可以完成多于工作所需要的功能,它也许变成了一个很大的工具,让它难以使用。就像我们看到的一些软件一样,例如目前的java api规范一样。这看起来有些奇怪,不想成功的ant达到了今天如此的成功。这是一个直接的答案对于这样的问题,许多人也许都发生过。我的确感到非常荣幸,幸运的发生了这个事情。

 

—James Duncan Davidson

San Francisco, CA, April 2002

本文地址:http://com.8s8s.com/it/it11988.htm