溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Gradle相對(duì)于Maven的優(yōu)點(diǎn)有哪些

發(fā)布時(shí)間:2020-10-28 16:28:06 來(lái)源:億速云 閱讀:189 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Gradle相對(duì)于Maven的優(yōu)點(diǎn)有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、Gradle介紹

Gradle和Maven作為自動(dòng)構(gòu)建工具,在項(xiàng)目的構(gòu)建中有著廣泛的應(yīng)用。他們之間有各自的優(yōu)缺點(diǎn),這里我們討論下他們?cè)陧?xiàng)目構(gòu)建中的一些區(qū)別并進(jìn)行比較。

首先簡(jiǎn)單介紹下Gradle和Maven。Maven主要服務(wù)于基于java平臺(tái)的項(xiàng)目構(gòu)建、依賴管理和項(xiàng)目信息管理。無(wú)論是小型的開(kāi)源類庫(kù)項(xiàng)目,還是大型的企業(yè)級(jí)應(yīng)用;無(wú)論是傳統(tǒng)的瀑布式開(kāi)發(fā)還是流行的敏捷模式,Maven都能大顯身手。Gradle是以groovy語(yǔ)言為基礎(chǔ),面向java應(yīng)用為主,基于DSL語(yǔ)法的自動(dòng)化構(gòu)建工具。

雖然兩種構(gòu)建工具有著很多相似處,但是在依賴管理、構(gòu)建生命周期、加載構(gòu)建系統(tǒng)組件等許多方面兩者有著許多區(qū)別。Maven使用XML來(lái)定義生成腳本,而 Gradle構(gòu)建腳本是用Groovy。 用XML的優(yōu)勢(shì)在于它可以更方便地定義構(gòu)建邏輯,但這是比較復(fù)雜的步驟。 用Groovy的好處是寫(xiě)起來(lái)比XML標(biāo)簽要簡(jiǎn)潔許多。 不過(guò)熟悉的XML的開(kāi)發(fā)人員比groovy的多,并且復(fù)雜的邏輯必須由自己編寫(xiě)。類似于Maven的pom.xml文件,每個(gè)Gradle項(xiàng)目都需要有一個(gè)對(duì)應(yīng)的build.gradle文件,該文件定義一些任務(wù)(task)來(lái)完成構(gòu)建工作,當(dāng)然,每個(gè)任務(wù)是可配置的,任務(wù)之間也可以依賴,用戶亦能配置缺省任務(wù)。

二、依賴管理

通常的Maven項(xiàng)目有一個(gè)單一的依賴的靜態(tài)配置, 所以一個(gè)項(xiàng)目應(yīng)該只有一個(gè)單一的Artifact。 因此其具備了簡(jiǎn)單的特點(diǎn)但同時(shí)也由于單一缺乏彈性。 Gradle在這方面的更靈活, 可以在創(chuàng)建和處理的時(shí)候有多套依賴配置。這里我們舉一個(gè)例子,原本的Maven POM配置是:

<properties>
 <kaptcha.version>2.3</kaptcha.version>
</properties>

<dependencies>
 <dependency>
  <groupId>com.google.code.kaptcha</groupId>
  <artifactId>kaptcha</artifactId>
  <version>${kaptcha.version}</version>
  <classifier>jdk15</classifier>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
 </dependency>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
 </dependency>
</dependencies>

然后我將其轉(zhuǎn)換成Gradle腳本,結(jié)果是驚人的:

dependencies {
 compile('org.springframework:spring-core:2.5.6')
 compile('org.springframework:spring-beans:2.5.6')
 compile('org.springframework:spring-context:2.5.6')
 compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
 testCompile('junit:junit:4.7')
}

我們可以發(fā)現(xiàn)配置代碼減少為原來(lái)的四分之一。這還不算我省略的一些父POM配置。最重要的是依賴的groupId、artifactId、 version,scope甚至是classfier,一點(diǎn)都不少。并且Gradle能夠解析現(xiàn)有的Maven POM或者Ivy的XML配置,從而得到傳遞性以來(lái)的信息,并且引入到當(dāng)前項(xiàng)目中,它也支持排除傳遞性依賴或者干脆關(guān)閉傳遞性依賴,Gradle當(dāng)你排除一項(xiàng)任務(wù)時(shí),所有依賴于此任務(wù)的任務(wù)都會(huì)自動(dòng)被排除如果他們之間沒(méi)有其他依賴關(guān)系,這是Maven所不具備的特性。

三、加載構(gòu)建系統(tǒng)的組件

Maven中每個(gè)用于構(gòu)建的組件(編譯/jar等)都作為一個(gè)插件, 每個(gè)插件都有它自己的版本和依賴關(guān)系樹(shù)。 Gradle的構(gòu)建系統(tǒng)組件都是分散的。 Maven插件的優(yōu)點(diǎn)是在于可以獨(dú)立更新,無(wú)需整個(gè)系統(tǒng)更新。Gradle的模型的優(yōu)點(diǎn)是編譯需要核心組件以外的組件時(shí)才下載。與此同時(shí)Gradle給了用戶足夠的自由去定義自己的任務(wù),Gradle每個(gè)任務(wù)都有一個(gè)描述,可以分配到一個(gè)組。Maven中插件和命令可以描述。比如Gradle你可以排除任何運(yùn)行的任務(wù)。在Maven中沒(méi)有通用的排除機(jī)制,必須用插件來(lái)實(shí)現(xiàn)它。而且Gradle具有高級(jí)任務(wù)排序的特性,任務(wù)之間的依賴關(guān)系被建立之后能夠得到完全控制,因?yàn)镚radle具有強(qiáng)大的語(yǔ)言結(jié)構(gòu)來(lái)描述任務(wù)之間的執(zhí)行順序,即使任務(wù)并不取決于對(duì)方的輸出。Gradle支持動(dòng)態(tài)任務(wù)創(chuàng)建,有時(shí)你想要一個(gè)任務(wù)的行為取決于或無(wú)限價(jià)值的大范圍的參數(shù)。一個(gè)很好的表達(dá)方式提供這樣的任務(wù)是任務(wù)規(guī)則。并且執(zhí)行任務(wù)時(shí),Gradle 在遇到第一次失敗時(shí)不停止,執(zhí)行每一個(gè)要執(zhí)行的任務(wù)其中所有的任務(wù)依賴關(guān)系都要被完成且沒(méi)有失敗。任務(wù)可以被分配去完成其他任務(wù)類似于java中的終結(jié)原則。他們總是在另一個(gè)任務(wù)執(zhí)行之后運(yùn)行,不管這個(gè)任務(wù)是否失敗了??梢园l(fā)現(xiàn)在一個(gè)單一的執(zhí)行中許多失敗任務(wù)會(huì)被很好地記錄成一個(gè)錯(cuò)誤報(bào)告并最終被匯總。

四、構(gòu)建生命周期

Maven提供有限的構(gòu)建生命周期訪問(wèn),插件可以連接到生命周期的特定階段,而且只有在核心插件執(zhí)行。而Gradle可以訪問(wèn)生成的一部分并允許用Groovy代碼進(jìn)行處理。Gradle Java Plugin也定義了構(gòu)建生命周期,包括編譯主代碼、處理資源、編譯測(cè)試代碼、執(zhí)行測(cè)試、上傳歸檔等等任務(wù),Gradle的構(gòu)建生命周期如下圖:

Gradle相對(duì)于Maven的優(yōu)點(diǎn)有哪些

相對(duì)于Maven完全線性的生命周期,Gradle的構(gòu)建生命周期略微復(fù)雜,不過(guò)也更為靈活,例如jar這個(gè)任務(wù)是用來(lái)打包的,它不像Maven那樣依賴于執(zhí)行測(cè)試的test任務(wù),類似的,從圖中可以看到,一個(gè)最終的build任務(wù)也沒(méi)有依賴于uploadArchives任務(wù)。這個(gè)生命周期并沒(méi)有將用戶限制得很死,由于Gradle完全是基于靈活的任務(wù)模型,因此很多事情包括覆蓋現(xiàn)有任務(wù),跳過(guò)任務(wù)都非常易于實(shí)現(xiàn)。而這些事情,在Maven的世界中,實(shí)現(xiàn)起來(lái)就比較的麻煩,或者說(shuō)Maven就不希望用戶這么做。

除了以上幾個(gè)Maven核心內(nèi)容與Gradle的區(qū)別,在面向?qū)ο筝敵瞿J?,GUI操作界面、聲明元素等方面Gradle也有良好表現(xiàn)。構(gòu)建輸出是構(gòu)建用戶體驗(yàn)的重要部分。在其他大多數(shù)構(gòu)建工具中默認(rèn)輸出對(duì)于一個(gè)構(gòu)建作者試圖調(diào)試一個(gè)問(wèn)題來(lái)說(shuō)是有關(guān)聯(lián)的。這通常會(huì)導(dǎo)致一個(gè)非常詳細(xì)的輸出會(huì)隱藏重要的警告和消息實(shí)際上是相關(guān)的開(kāi)發(fā)人員運(yùn)行構(gòu)建。Gradle的默認(rèn)輸出是針對(duì)開(kāi)發(fā)人員運(yùn)行構(gòu)建和只顯示消息相關(guān)的情況下而不是濫用日志輸出作為一種進(jìn)度,例如在執(zhí)行測(cè)試的時(shí)候。構(gòu)建輸出為構(gòu)建用戶體驗(yàn)是非常重要的。如果你與外部工具和庫(kù)集成他們的控制臺(tái)輸出可能非常冗長(zhǎng)。Gradle系統(tǒng)中你可以定義每個(gè)外部工具結(jié)合的日志級(jí)別的輸出應(yīng)該被路由。Gradle提供GUI操作界面,這是一個(gè)獨(dú)立的用戶界面,可以啟動(dòng)GUI選項(xiàng),通過(guò)自定義日志模式你可以替換它的日志與自己的UI。Gradle有許多細(xì)粒度的聲明性元素,如SourceSets或Android Product Flavors。它們的核心Gradle DSL然后讓Gradle構(gòu)建語(yǔ)言更加豐富。他們不斷構(gòu)建簡(jiǎn)潔、易于使用、維護(hù)和理解即使你有復(fù)雜的需求。Maven沒(méi)有細(xì)粒聲明元素,這是Maven極端頑固的主要原因。在Gradle,每個(gè)插件都可以提供自己的粗或細(xì)粒聲明元素。這使你可以提供一個(gè)聲明性方法甚至定制域。它還允許其他技術(shù)集成在Gradle中,讓它被更多人使用。

整體來(lái)講,Gradle給人一種簡(jiǎn)潔靈活的體驗(yàn),然而必須掌握groovy也是他的問(wèn)題,而且由于其靈活性,導(dǎo)致人們更容易破壞約定以至于讓構(gòu)建變得難以理解。但是Gradle確實(shí)是Maven理念的優(yōu)秀實(shí)現(xiàn)。如果足夠了解Groovy,也理解Maven的配置和構(gòu)建,Gradle會(huì)是絕佳選擇,尤其是它幾乎能和現(xiàn)有的Maven系統(tǒng)無(wú)縫集成,而且你也能享受到簡(jiǎn)潔帶來(lái)的極大樂(lè)趣,相信Gradle作為后起之秀在今后能夠被完善的更好。

上述就是小編為大家分享的Gradle相對(duì)于Maven的優(yōu)點(diǎn)有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI