用Ruby簡化Java項目的構建
構建一個項目,是一件極其復雜的事情。尤其是那種非常復雜的工程。
拿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支持
- 根據源信息生成項目信息網站
目前我能想到的辦法只有一個,就是自己寫(呵呵)。大家有什么高見?
posted on 2006-11-19 17:36 guitarpoet 閱讀(490) 評論(0) 編輯 收藏 所屬分類: 軟件工程