大家好,我是胡曉宇,目前在云效主要負(fù)責(zé)Flow流水線編排、任務(wù)調(diào)度與執(zhí)行引擎相關(guān)的工作。
作為一個有多年Java開發(fā)測試工具鏈開發(fā)經(jīng)驗的CRUD專家,使用過所有主流的Java構(gòu)建工具,對于如何高效使用Java構(gòu)建工具沉淀了一套方法。眾所周知,當(dāng)前最主流的Java構(gòu)建工具為Maven/Gradle/Bazel,針對每一個工具,我將分別從日常工作中常見的場景問題切入,例如依賴管理、構(gòu)建加速、靈活開發(fā)、高效遷移等,針對性地介紹如何高效靈活地用好這3個工具。
Java構(gòu)建工具的前世今生
在上古時代,Java的構(gòu)建都在使用make,編寫makefile來進行Java構(gòu)建有非常多別扭與不便的地方。
緊接著Apache Ant誕生了,Ant可以靈活的定義清理編譯測試打包等過程,但是由于沒有依賴管理的功能,以及需要編寫復(fù)雜的xml,還是存在著諸多的不便。
隨后Apache Maven誕生了,Maven是一個依賴項管理和構(gòu)建自動化工具,遵循著約定大于配置的規(guī)則。雖然也需要編寫xml,但是對于復(fù)雜工程更加容易管理,有著標(biāo)準(zhǔn)化的工程結(jié)構(gòu),清晰的依賴管理。此外,由于Maven本質(zhì)上是一個插件執(zhí)行框架,也提供了一定的開放性的能力,我們可以通過Maven的插件開發(fā),為構(gòu)建構(gòu)成創(chuàng)造一定的靈活性。
但是由于采用約定大于配置的方式,喪失了一定的靈活性,同時由于采用xml管理構(gòu)建過程與依賴,隨著工程的膨脹,配置管理還是會帶來不小的復(fù)雜度,在這個背景下,集合了Ant與Maven各自優(yōu)勢的Gradle誕生了。
Gradle也是一個集合了依賴管理與構(gòu)建自動化的工具。首要的他不再使用XML而是基于Groovy的DSL來描述任務(wù)串聯(lián)起整個構(gòu)建過程,同時也支持插件提供類似于Maven基于約定的構(gòu)建。除了在構(gòu)建依賴管理上的諸多優(yōu)勢之外,Gradle在構(gòu)建速度上也更具優(yōu)勢,提供了強大的緩存與增量構(gòu)建的能力。
除了以上Java構(gòu)建工具之外,Google在2015年開源了一款強大,但上手難度較大的分布式構(gòu)建工具Bazel,具有多語言、跨平臺、可靠增量構(gòu)建的特點,在構(gòu)建上可以成倍提高構(gòu)建速度,因為它只重新編譯需要重新編譯的文件。Bazel也提供了分布式遠(yuǎn)程構(gòu)建和遠(yuǎn)程構(gòu)建緩存兩種方式來幫助提升構(gòu)建速度。
目前業(yè)內(nèi)使用Ant的人已經(jīng)比較少,主要都在用Maven、Gradle和Bazel,如何真正基于這三款工具的特點發(fā)揮出他們最大的效用,是這個系列文章要幫大家解決的問題。先從Maven說起。
優(yōu)雅高效地用好Maven
當(dāng)我們正在維護一個Maven工程時,關(guān)注以下三個問題,可以幫助我們更好的使用Maven。
● 如何優(yōu)雅的管理依賴
● 如何加速我們的構(gòu)建測試過程
● 如何擴展我們自己的插件
優(yōu)雅的依賴管理
在依賴管理中,有以下幾個實踐原則,可以幫助我們優(yōu)雅高效的實現(xiàn)不同場景下的依賴管理。
● 在父模塊中使用dependencyManagement,配置依賴
● 在子模塊中使用dependencies,使用依賴
● 使用profiles,進行多環(huán)境管理
以我在日常開發(fā)中維護的一個標(biāo)準(zhǔn)的spring-boot多模塊Maven工程為例。
工程內(nèi)各個module之間的依賴關(guān)系如下,通常這也是標(biāo)準(zhǔn)的 spring-boot restful api多模塊工程的結(jié)構(gòu)。
便捷的依賴升級
通常我們在依賴升級的時候會遇到以下問題:
● 多個依賴關(guān)聯(lián)升級
● 多個模塊需要一起升級
在父模塊的pom.xml中,我們配置了基礎(chǔ)的spring-boot依賴,也配置了日志輸出需要的logback依賴,可以看出,我們遵循了以下的原則:
(1)在所有子模塊的父模塊中的pom中配置dependencyManagement,統(tǒng)一管理依賴版本。在子模塊中直接配置依賴,不用再糾纏于具體的版本,避免潛在的依賴版本沖突。
(2)把groupId相同的依賴,配置在一起,比如groupId為org.springframework.boot,我們配置在了一起。
(3)把groupId相同,但是需要一組依賴共同提供功能的artifactId,配置在一起,同時將版本號抽取成變量,便于后續(xù)一組功能共同的版本升級。比如spring-boot依賴的版本抽取成了spring-boot.version。
文章來源:http://www.zghlxwxcb.cn/news/detail-435280.html
在子模塊bu文章來源地址http://www.zghlxwxcb.cn/news/detail-435280.html
到了這里,關(guān)于高效使用Java構(gòu)建工具|Maven篇|云效工程師指北的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!