构建一个项目,是一件极其复杂的事情。尤其是那种非常复杂的工程。
拿Java来说,构建一个项目的问题有一下这么几个:
- 项目的组织方式
- 项目的源代码控制策略
- 项目的依赖控制(工程之间的依赖以及第三方库的依赖)
- 项目的构建方式
- 项目的构建和发布周期
现在,有一些人还是在使用IDE来进行项目的配置管理的,它的缺点是什么呢?
- 一般的IDE都拥有项目组织的功能。但是,可惜的是。IDE自带的项目组织功能往往比较弱,IDE采取的项目组织方式都是平行式的,没有项目的层次感,必须通过逐级命名来体现,比如foo项目下,有两个子项目,于是分别命名为foo.bar和foo.demo,同理再深一层为foo.bar.web等,项目完全平行化管理(结构未必一定是平行的,但是对于IDE而言,它们是平等的)
- 现在流行的IDE对源代码控制工具都有非常不错的支持
- IDE对同一个工作区里的项目依赖的控制作的非常不错,但是形式相对单一
- 一般都是采用IDE自行手工构建,某些IDE可以给你提供Ant脚本(比如NetBeans),如果采用复杂的构建策略,那么要做很多手工的操作
- 没法实现自动化构建,随着项目的增大,构建成本越来越大,构建和发布周期倾向于延长
现在,大多数的Java开发人员都采取了使用Ant脚本进行构建的方式。因为Ant脚本:
- 不会影响你的项目的组织方式,你可以随意的按照任何方式组织你的项目
- Ant对源代码控制工具有很好的支持
- Ant可以明确的管理和控制项目的依赖,通过Ivy可以自动下载项目依赖
- 自动化批处理的方式
- 支持构建服务器,可以实现每日构建
但是,Ant脚本也不是一点儿问题也没有。首先,Ant脚本的重用性不好。一般意义上的Ant脚本重用,就是Copy&Paste。Ant对此没有什么封装。其次,Ant使用起来也比较困难,XML格式的脚本不是十分的好写(有了Eclipse支持以后,强了很多),作为脚本语言,Ant非常的不完善(连字符串处理的功能都非常弱,这一点Ant-Contrib提供了一些好一点儿的支持)。Ant的扩展机制完全基于Java,不能做到即时修改。
除了Ant,在Java中,还可以采用Maven进行项目的构建。Maven项目是一个非常出色的项目。首先,它体现了Apache资深开发人员的项目组织和管理智慧。另外,它以统一有效的方式实现了项目的整个构建生命周期。Maven的黑盒化操作也给项目的配置管理减轻了负担。如果采用了Maven的话,项目的组织方式、项目的构建方式、项目的发布控制全部迎刃而解。而且你所作的扩展,也是以插件的方式来透明化的起作用的。重用性比Ant高很多。使用起来也非常简便。
但是,Maven也并不是没有缺点。首先,Maven的项目组织方式是固定的,虽然这种固定的方式确实非常有道理。但是,如果与现有项目不兼容或者与IDE的项目组织方式不兼容的话,那么就完全不起作用了。比如Eclipse的Plugin项目,PDE的项目组织格式就与Maven2的项目格式完全不兼容。而且,Maven2自身的Manifest文件生成功能比较弱,对于OSGI项目而言,根本没有可用性(因为要造成重复工作)。由于Maven采用的是黑盒操作方式。操作不透明。你如果想作一些简单的自定义操作,也必须写一个Maven的插件。插件的测试、调试和修改都要比Ant困难得多。
那么有什么好办法呢?我推荐采用Ruby。
首先,Ruby是一种脚本语言,支持的环境有很多,而且还可以采用JRuby来运行。而且,Ruby支持一个类似Make语法的脚本语言,那就是Rake。
Rake脚本其实就是标准的Ruby脚本,拥有所有Ruby拥有的特性(面向对象等)。而Ruby也有非常好的依赖控制系统Gem(我个人认为比目前的Maven的依赖控制系统要好)。由于Ruby是标准的解释型语言,所以操作都是非常透明的,也可以做到即时修改的效果。所以,用来作构建脚本是非常合适的。
但是,怎么用它来构建Java项目呢?现在已经存在一个基于Rake的Java构建系统了,那就是:Raven。
Raven除了提供一些处理Java的Rake Task之外,它还提供了对Maven Repository的Gem封装,这样,你就可以采用Gem的方式来获取Java的项目依赖了。
Rake是我所看到的第一个用面向对象语言来写构建脚本的。但是,它也并不是完全没有缺点的,对Java的支持太少,就是一个很讨厌的缺点。
如果想要采用Rake,而且还要做到象Maven那样好,那么至少要有以下几个功能(除去Raven已经提供的功能):
- 新项目的Archetype功能
- Java项目构建生命周期模型
- IDE支持
- 根据源信息生成项目信息网站
目前我能想到的办法只有一个,就是自己写(呵呵)。大家有什么高见?