08 January 2014

兩個月前我們要開始新的專案,想說即然是新的,那就重整 build 環境重新出發吧!我們的開發環境在一年多前轉換到 git 後,就沒有大的改變。依然還是用 maven,架在老舊的 CentOS 上,用著破破的 maven proxy。說到 maven,我可以從現在開始幹譙到明年,我只有一個結論,它是白吃設計的。

要 build java 專案其實也用不著 maven,但是:想處理函式庫的相依性嗎?大家都放 maven repository 裡;想 build GWT 嗎?maven 有好的整合;想 build Android 嗎?maven 也有 plugin。maven 的生態系太大了,基本上沒有第二個選擇可以像 maven 一樣滿足眾多的需求。因此,年復一年,只能邊吐血邊用,沒有取代品可換。

救星 Gradle

Gradle 已經出很久了,它出道的第一天我就注意到了,因為它的 文件瘋狂的完整 。基本上就是 Spring/Hibernate 那種等級,有個數十頁的手冊。那時就想如果作者繼續發展下去,總有一天會像是 Spring 那樣,成為 Java 界的基石之一。但是即時有完整的文件,沒有豐富的生態系也是白搭,所以就放著它沒管了。

漸漸的,大型 Open Source 開始轉移了,Hibernate 開了第一槍。隔一兩年後 Spring 也跟進了。那個時期 (一年前) 如果你只做 server side java,大概可以脫離 maven 這個地獄,直接轉換到新的 Gradle,不會有任何問題。但是我們公司手頭上還有 GWT 和 Android 的專案要 build,因此也卡住,無法轉移。

終於,去年 Google I/O 時,Google 發表了 Android Studio,試圖取代 Eclipse ADT,而且新的 IDE 將以 Gradle 為基礎。Google 這家公司是不用 maven 的 (很聰明),他們只用 Ant。Android 轉換到 Gradle 表示 Google 內部開始轉移了。我想這是最後的一擊。Java 的開發者已經沒有理由繼續用 maven 了。

時至今日,Android 的 Gradle Plugin 已經趨向成熟,我們這一兩個月使用下來很滿意,新的開發環境順利遷移到 Gradle。拜 Gradle 的彈性所賜,GWT 我們也完成轉移,因為只要寫個 script 就搞定了 (雖然花了一整天嘗試...)。我們以前的專案都要混用 bash + python + maven 才能完成。現在通通都是 Gradle script,可攜性和可維護性都更好了。

Gradle 語法

Gradle 本身使用起來如何呢?首先是它起動有點慢,比 maven 慢一點,但是開始跑之後,Gradle 又比較快了,因為 maven 老是在爬那些 repository,下載超慢。Gradle 也只會做變更的部份,所以可以省掉很多時間。整個體驗就是順順順。不過語法上只能算 ok。

我個人不喜歡 Groovy 這語言,因為同一件事有太多種做法,有太多 DSL 的變型。因為那些變化多端的寫法,一開始會搞不清楚哪些語法是設定,哪些是執行。但其實說穿了那些 DSL,不管用什麼型式寫,都只是呼叫 method 而已,想通了就不難懂了。不過組織內最好用同一個 style 寫 script 或設定,不然明明是做一樣的事,卻寫的完全不一樣只會增加維護的困難。

Android, Eclipse, Gradle 併用

我們公司轉到了 Gradle,不過 Android 方面仍然是用 Eclipse 開發,因為 Android Studio 仍不夠成熟。這個過渡期間,我們 build Android apk 是用 Gradle;而開發/除錯用 Eclipse;然後 Eclipse 專案環境也是用 Gradle 產生。最後一項最麻煩,本來 Gradle 的 Eclipse plugin 可以依函式庫的依賴設定,產生 Eclipse 需要的 .classpath 檔,但 Android plugin 和 Java plugin 卻不相容,因此不能共存。解決方法是拆成不同的 .gradle 檔案,依不同 工作切換即可。

上述正是 Gradle 彈性高的例子,遇到了問題可以自己很快解決,不用像 maven,還要等 plugin 開發者改好、而且願意改才行。我們現在增減 Android 專案所依賴的函式庫,只要下 gradle eclipse ,而建立 apk 只要 gradle assembleDebug ,通通一步搞定。

Gradle 優缺點

優點
  • Programmable
  • 專案結構有彈性
  • 順!
  • 支援 Android
  • 文件齊全
  • 大型專案、大公司都轉了,有保障
  • 不是 maven
缺點
  • 啟動慢
  • Groovy 語法變型太多

It's time to move

Java 的生態系是以囉嗦著名的,什麼鬼 J2EE,EJB,XML... blah blah。然後 maven 也是這臭名的貢獻者之一。因為 Gradle 的逐漸成熟,Java 又甩開了一個舊時代的包袱。我理解大家手上如果有舊專案要維護的話,仍然會繼續延用 Ant 或 maven,這一點我們也是如此。但是新專案就不要再猶豫了,Gradle 已通過多項大型專案的考驗,Android 未來的資源也只會集中在 Gradle 上。It's time to move!


回響

可以用 Tag <I>、<B>,程式碼請用 <PRE>