確定B2B網(wǎng)站建設(shè)方案新聞聯(lián)播俄羅斯與烏克蘭
大家好,我是風(fēng)箏
作為Java 開發(fā)者,你平時(shí)用 Maven 還是 Gradle?
我一直用的都是 Maven,但是前幾天做了一個(gè)小項(xiàng)目,用的是 Gradle,因?yàn)轫?xiàng)目創(chuàng)建出來(lái)默認(rèn)就是用的 Gradle,而且功能足夠簡(jiǎn)單,我也就沒(méi)動(dòng)。
實(shí)話說(shuō),以前也接觸過(guò) Gradle。最早是我想學(xué)學(xué) Android 開發(fā),Android 項(xiàng)目默認(rèn)就是用 Gradle,其實(shí)那時(shí)候我對(duì)Gradle 的印象就不是很好。
本來(lái)下載 Android SDK 就夠慢的了,我記得第一次搭A(yù)ndroid 環(huán)境,弄了足足一天。好不容易 SDK下載完了,就想寫了 Hello World 跑一下,結(jié)果發(fā)現(xiàn)本地沒(méi)有 Gradle,這時(shí)候Android Stuido 其實(shí)會(huì)自動(dòng)下載 Gradle 的(就是一個(gè) Gradle.zip的文件,相信很多人對(duì)這個(gè)文件有陰影),但是國(guó)內(nèi)的網(wǎng)絡(luò)死活就是下載不下來(lái)。(ps: 現(xiàn)在下載 Gradle 應(yīng)該是問(wèn)題不大了,因?yàn)?Gradle 開通了國(guó)內(nèi)的 CDN)
大哥,我就想跑個(gè) Hello World,何罪之有啊!后來(lái)一頓搜索,跟著好幾個(gè)教程,好歹是跑起來(lái)了。
在那兒之后,我就沒(méi)碰過(guò) Gradle 了。直到有一天,看到 Spring 和 Spring Boot 都從 Maven 切換到 Gradle了。誒,難不成 Gradle 已經(jīng)這么厲害了,讓 Spring 團(tuán)隊(duì)都拋棄 Maven 了。
然后我把 Spring Boot 最新倉(cāng)庫(kù) clone 下來(lái),結(jié)果一構(gòu)建,一堆報(bào)錯(cuò),解決一個(gè)又一個(gè)呀,就這?
我把原因歸結(jié)于 Gradle 使用門檻過(guò)高,外加自己能力不行。直到有一天看到有人說(shuō):“有幾個(gè) Gradle 項(xiàng)目能一次性構(gòu)建成功跑起來(lái)的嗎?”
當(dāng)然這不能就說(shuō) Gradle 不好用,Gradle 老鳥們基本上不存在這樣的問(wèn)題,說(shuō)到底還是理解的不夠到位。
為什么 Spring 放著好好的 Maven 不用,要費(fèi)大力氣切到 Gradle呢?Spring 這么大的項(xiàng)目,切到 Gradle 也沒(méi)那么容易,也是在很多人(包括Gradle 團(tuán)隊(duì)成員)的幫助下才遷移完成的。據(jù)官方介紹,遷移的主要原因就是為了減少構(gòu)建時(shí)間,構(gòu)建速度確實(shí)是 Gradle 強(qiáng)于 Maven的一大優(yōu)勢(shì),尤其是對(duì)于大項(xiàng)目更是如此。
Maven
Maven 是一個(gè)項(xiàng)目管理和構(gòu)建工具,主要用于 Java 項(xiàng)目的構(gòu)建、依賴管理和項(xiàng)目生命周期管理。Maven 的核心是包管理工具,至于項(xiàng)目構(gòu)建其實(shí)是依靠插件來(lái)完成的,比如 maven-compiler-plugin插件等。
Maven 遵循“約定優(yōu)于配置”的原則,提供了一套默認(rèn)的項(xiàng)目結(jié)構(gòu)和構(gòu)建流程。如果開發(fā)者遵循這些約定,Maven 就能自動(dòng)處理很多配置工作,從而減少開發(fā)者的配置負(fù)擔(dān)。
Maven 使用 XML 文件的形式管理依賴包,也就是項(xiàng)目中的 pom.xml,整個(gè) XML 文件的格式都是固定的,倉(cāng)庫(kù)怎么引入、依賴怎么引入、插件怎么引入都是約定好的,照著做就好了,一個(gè)項(xiàng)目的 pom 文件,復(fù)制到另一個(gè)項(xiàng)目中,改一下包依賴、改一下基本項(xiàng)目信息,其他的基本完全復(fù)用。
Gradle
Gradle 是一個(gè)構(gòu)建自動(dòng)化工具,廣泛用于軟件項(xiàng)目的構(gòu)建、依賴管理和項(xiàng)目生命周期的管理。它最初是為了構(gòu)建 Java 項(xiàng)目而設(shè)計(jì)的,但如今它支持多種編程語(yǔ)言和技術(shù),包括 Java、Kotlin、Groovy、Scala、Android 等。
其在自動(dòng)化構(gòu)建能力上更強(qiáng),包管理只是其中的一個(gè)功能。
Gradle 采用基于 Groovy 或 Kotlin 的領(lǐng)域特定語(yǔ)言(DSL),允許開發(fā)者通過(guò)編寫腳本來(lái)自定義構(gòu)建過(guò)程。相比其他構(gòu)建工具(如 Maven),Gradle 更加靈活和強(qiáng)大。這就是它靈活性所在,但是也是它的門檻所在,也就是說(shuō)你要使用它,還要理解 Groovy 或 Kotlin,理解的不到位可能會(huì)帶來(lái)很多問(wèn)題。這也是很多人吐槽它的原因,過(guò)于靈活的副作用就是門檻過(guò)高。
優(yōu)缺點(diǎn)比較
其實(shí)通過(guò)上面的介紹也能看出一些端倪了。
學(xué)習(xí)門檻
首先在學(xué)習(xí)門檻上,顯然 Gradle 更高。一般項(xiàng)目, Maven 加幾行 XML 就行了,構(gòu)建插件也就那么幾個(gè),只需要復(fù)制粘貼就可以了,而 Gradle 中多少要了解一點(diǎn) Groovy 或 Kotlin 吧。
靈活性
Gradle 的靈活度更高,Maven 則是中規(guī)中舉。如果你的構(gòu)建行為比較復(fù)雜,可能純靠 Maven 自己的配置文件沒(méi)辦法實(shí)現(xiàn),就需要你自己寫一些輔助腳本了。而用 Gradle 的話,你可以使用它的 DSL 能力定制非常復(fù)雜的構(gòu)建流程。
性能
這個(gè)不得不承認(rèn),Gradle 的性能更高。據(jù)官方介紹,一般的項(xiàng)目使用 Gradle 構(gòu)建的速度是Maven 的至少2倍,而一些大型項(xiàng)目的復(fù)雜構(gòu)建,在極端情況下能達(dá)到 Maven 的100倍,這好像有點(diǎn)兒夸張了,不過(guò)快幾倍應(yīng)該是有的,這也是為什么 Spring 切換到 Gradle 的理由,切換到 Gradle 后,構(gòu)建時(shí)間大概是20多分鐘,可想而知,使用 Maven 的話,應(yīng)該要一個(gè)小時(shí)以上了。
性能好是有代價(jià)的,除了原理不一樣外,Gradle 會(huì)有一些后臺(tái)進(jìn)程,所以,對(duì)于一些性能不怎么樣的開發(fā)機(jī)來(lái)說(shuō),使用 Gradle 反而會(huì)覺(jué)得卡。
用戶體驗(yàn)
用戶體驗(yàn)是個(gè)很主觀的東西,有人就覺(jué)得 Maven 好,即使慢一點(diǎn),也是它好。有人就覺(jué)得 Gradle 好,靈活,而且門檻高,用它說(shuō)明我技術(shù)好啊。
但是 Maven 的穩(wěn)定性是非常好的,一個(gè) Maven 3.5 用好幾年也沒(méi)啥問(wèn)題,但是 Gradle 不一樣,好多版本是不做兼容的。比如我本地安裝了新版本,但是有一個(gè)項(xiàng)目用的是老版本,那很可能這個(gè)項(xiàng)目是沒(méi)辦法跑起來(lái)的,只能去安裝和這個(gè)項(xiàng)目適配的版本。這也是 Gradle 被瘋狂吐槽的一個(gè)點(diǎn),即使是 Gradle 用戶。
最后
作為開發(fā)者如何選擇呢?對(duì)我來(lái)說(shuō),我就老實(shí)的用 Maven 就好了,反正我也基本上做不了那么大型的、構(gòu)建一次幾個(gè)小時(shí)的應(yīng)用,使用 Maven 就圖個(gè)省心。安心寫代碼就好了,構(gòu)建的事兒交給Maven、交給插件就好了。典型的實(shí)用主義。
一家之言啊,作為開發(fā)者來(lái)說(shuō),第一肯定是要跟著公司的規(guī)定來(lái),公司如果用 Gradle ,那你也不能堅(jiān)持用 Maven。同理,公司用 Maven,你也不能另辟蹊徑的用 Gradle 。
其實(shí)到最后可能就是習(xí)慣問(wèn)題了,如果一個(gè)工具用的時(shí)間超過(guò)幾個(gè)月,那基本上所有的問(wèn)題都不是問(wèn)題了