解決Maven並行編譯中出現打包錯誤問題的思路


解決Maven並行編譯中出現打包錯誤問題的思路

並行構建

Maven 3.x 提供了並行編譯的能力,通過執行下列命令就可以利用構建服務器的多線程/多核性能提升構建速度:

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

采用並行構建時,Maven會分析項目的依賴並規划出可以進行並行構建的模塊

問題

通過並行編譯確實能提升構建速度,但是如果在寫pom時不加注意,那么很容易就會引發新問題。最近遇到並行編譯引發打包錯誤的問題,問題的外在表現都很相似,即在使用maven插件進行打包時,發生了無法找到相應的包導致構建無效版本或無法產生打包版本的錯誤。

通常在一個項目中,想要子系統或模塊實現先后依賴順序,可以采用在parent pom中按照依賴順序編寫module的方式,如下所示。

<modules>
  <module>A</module>
  <module>B</module>
  <module>C</module>
</modules>

按照上述內如,A、B、C三個子模塊將按照先A,再B,最后C的順序依次構建,在串行構建時,情況確實如此,但是到了並行構建中,這樣的順序就無法保證了,即使能夠保證按照A、B、C的順序並行構建,由於子模塊構建時間不同,依然會出現最后的子模塊率先構建完成的情景。

解決之道

先回到maven看下它是如何處理構建,如下圖所示。

img
圖中每個節點代表多模塊構建中的單個模塊,而“級別”標注了與第一個模塊的在依賴關系上的距離,Maven根據模塊依賴來計算出上圖,需要注意的是maven中的繼承關系也是一種依賴。
簡化說明,假設所有的模塊具有相等的構建時間,構建先從級別0開始,然后是並行的5個級別1;在級別2,會並行構建3個模塊,以此類推,是級別3中個7個並行構建模塊,這樣構建方式源於pom中聲明的依賴,當然在實際的構建過程中,各個模塊的構建的時間是不一致,從而導致了上述問題

從上述分析可以看出,依賴是maven能夠正確識別構建先后順序的,即使是並行構建場景。這種依賴關系處理可以有兩種方式,視構建認為的規模而定。

  • 解耦構建與打包,將打包從構建中剝離出來,單獨執行
  • 增強依賴,特別是在負責打包的部分,對於打包部分,要求顯式地依賴其他的構建結構

參考

Parallel builds in Maven 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM