Maven是比較流行的java構(gòu)建工具,Maven的常見問題可能包括依賴沖突、緩存解析,以及構(gòu)建時(shí)間緩慢。為什么Maven構(gòu)建花費(fèi)的時(shí)間比它應(yīng)該花費(fèi)的時(shí)間更長,如何改進(jìn)。下面是對Maven緩慢構(gòu)建進(jìn)行故障排除的四個(gè)技巧。想要了解有關(guān)Maven的更多知識(shí),可以報(bào)名參加java培訓(xùn)來學(xué)習(xí),在專業(yè)老師的教學(xué)指導(dǎo)下,你可以很快掌握Maven使用技能。
1. Maven中的并行構(gòu)建
默認(rèn)情況下,Maven不會(huì)利用硬件的全部功能。它按順序而不是并行地構(gòu)建所有模塊。但是,項(xiàng)目設(shè)置通常不要求是連續(xù)的。通常,您可以命令Maven分析項(xiàng)目,包括依賴關(guān)系圖,并在可能的情況下并行構(gòu)建項(xiàng)目。您可以指定用于構(gòu)建項(xiàng)目的確切線程數(shù),也可以使用參數(shù)的可移植版本,并根據(jù)計(jì)算機(jī)上可用的CPU指定線程數(shù)。
mvn -T 4 install -- will use 4 threads
mvn -T 1C install -- will use 1 thread per available CPU core
雖然您的項(xiàng)目可能不容易并行構(gòu)建,但值得一試,速度可能會(huì)大大加快。默認(rèn)情況下,每個(gè)CPU核心使用一個(gè)線程。您的開發(fā)機(jī)器可能有多余的計(jì)算能力,加快構(gòu)建總是有用的。
2. 并行運(yùn)行Maven測試
測試是構(gòu)建的一個(gè)方面,它可能對您的構(gòu)建速度有最大的影響。最常見的做法是在您只對構(gòu)建工件感興趣時(shí)禁用測試,但我們不能推薦這種非常規(guī)工程實(shí)踐。如果您真的打算在Maven構(gòu)建過程中跳過測試目標(biāo),那么大多數(shù)插件所尊重的最常見屬性是:-DskipTests=true。然而,您可以在不破壞反饋循環(huán)的情況下實(shí)現(xiàn)更快的構(gòu)建時(shí)間。在java培訓(xùn)中,會(huì)有關(guān)于Maven的使用技巧的課程,學(xué)好這些技巧,有助于更好地進(jìn)行開發(fā)項(xiàng)目,少出問題。
答案是并行運(yùn)行測試。我們剛才討論的并行化技術(shù)在模塊級(jí)工作。如果您正在使用一個(gè)已建立的插件來運(yùn)行測試,比如說Surefire,您還可以將其配置為在模塊內(nèi)并行執(zhí)行。并行運(yùn)行測試可能會(huì)導(dǎo)致不必要的副作用,特別是當(dāng)它們糾結(jié)在一起并期望按特定順序執(zhí)行時(shí)。然而,這完全是另一回事,你應(yīng)該完全嘗試一下,看看它是否適合你,以及它能加速你的構(gòu)建速度。你可以在以后找出失敗的原因。
3. 僅構(gòu)建必要的模塊
您通常使用什么命令來構(gòu)建項(xiàng)目?答案是:
mvn clean install
清理Maven時(shí),會(huì)刪除所有生成的工件、所有臨時(shí)文件,除了配置和簽入版本控制的文件。然后,它會(huì)再次生成這些文件的新副本。當(dāng)您遇到一個(gè)奇怪的緩存問題或一些您有但其他人無法復(fù)制的模糊錯(cuò)誤時(shí),它非常有用。
然而,這將需要額外寶貴的秒數(shù)和CPU周期來完成基本上不必要的重新創(chuàng)建現(xiàn)有文件的工作。相反,您通常想要做的是以增量方式構(gòu)建項(xiàng)目。通過java培訓(xùn)學(xué)習(xí),可以幫助你更好地了解Maven相關(guān)問題,提高開發(fā)效率。
假設(shè)您有一個(gè)多模塊項(xiàng)目,其中包含很少更改的公共核心模塊,以及您當(dāng)前正在開發(fā)的web界面。更改web界面模塊后,請嘗試運(yùn)行以下命令:
mvn install -pl $moduleName -am
首先,我們刪除了對clean階段的隱式調(diào)用。這個(gè)項(xiàng)目很少需要清潔,所以我們不想一直這樣做。讓我們看一下剛才使用的Maven命令中其他選項(xiàng)的描述:
-pl-使Maven只構(gòu)建指定的模塊,而不是整個(gè)項(xiàng)目。
-am-使Maven了解我們的目標(biāo)依賴于哪些模塊,并構(gòu)建它們。
同時(shí)使用這些選項(xiàng)的結(jié)果是靈活性和速度的完美結(jié)合。我們知道我們通常使用什么模塊,如果我們更改了任何依賴項(xiàng),它們也將被更新。同時(shí),您的項(xiàng)目構(gòu)建的很大一部分將被跳過,因?yàn)樗匀皇切碌模恍枰亟ǎ蛘咭驗(yàn)樗皇悄繕?biāo)模塊的一部分,也不會(huì)發(fā)揮作用。
4. 限制上網(wǎng)
如果你有時(shí)覺得Maven正在下載互聯(lián)網(wǎng),要知道你并不孤單!這是任何構(gòu)建系統(tǒng)、npm、gradle、sbt最常見的投訴之一。如果你能說出它的名字,你會(huì)驚訝于有多少人類已知的庫和可傳遞的依賴項(xiàng)需要在任意的、通常是最不合適的時(shí)間下載。然而,有一個(gè)簡單的選項(xiàng)可以讓Maven離線工作。
啟用脫機(jī)模式時(shí),Maven在解析依賴項(xiàng)時(shí)不會(huì)連接到任何遠(yuǎn)程存儲(chǔ)庫。本地存儲(chǔ)庫中的所有jar文件仍然可用,因此不會(huì)破壞您的正常工作流程。因此,只需在mvn命令后面附加--offline或--o,Maven就不會(huì)試圖檢查您最喜歡的依賴項(xiàng)的新快照,也不會(huì)讓您等待網(wǎng)絡(luò)響應(yīng)。想要學(xué)習(xí)java更多知識(shí)和技能,可以考慮參加java培訓(xùn),有經(jīng)驗(yàn)豐富的專業(yè)講師指導(dǎo)教學(xué),有緊跟市場需求的實(shí)時(shí)課程,可以讓你快速掌握這門技術(shù),節(jié)約時(shí)間,少走彎路。