使用 flatten-maven-plugin 簡化 Maven 專案版本控制的經驗

關於我們

在1C,我們開發的不僅是一個平台 1C:企業C++ и JavaScript的,還有 Java 應用程式 - 特別是新的開發環境 企業開發工具 基於 Eclipse 以及與平台深度整合的訊息伺服器 - 互動系統.

條目

我們最常使用 Maven 作為 Java 應用程式的建置系統,在這篇短文中,我們想談談我們在組織開發過程中必須面對的問題之一,以及幫助我們克服這個問題的方法問題。

先決條件和工作流程

由於我們的 Maven 專案開發的特殊性,我們使用了相當多的模組、依賴項和子專案。 一棵樹中的pom檔案數量可以是幾十甚至上百個。

使用 flatten-maven-plugin 簡化 Maven 專案版本控制的經驗

看起來:沒什麼大不了的,他們創建了一次就忘了。 如果您需要一次更改或添加所有文件中的某些內容,編輯器和 IDE 中有很多方便的工具。 pom.xml 最常見的常規變更是什麼? 我們認為專案版本和依賴項發生了變化。 也許有人會對此提出異議,但這正是我們的情況。 原因在於,與核心一起,我們同時開發了許多自己的程式庫,為了建立和測試結果的持續可重複性,使用快照對我們來說似乎不是一種方便的方法。 因此,有必要在每次建置時提高專案的版本號。

此外,開發人員有時需要建立自己的庫分支並根據所有依賴項檢查其功能,為此他必須手動更改所有依賴項的版本。

初步解決方案

由於如此頻繁和多個版本更改,我希望簡化 CI 內的流程並實現自動化。 這時,一個方便的、眾所周知的插件就可以派上用場了。 版本-maven-插件 - 連接並啟動它

mvn -N 版本:設定-DnewVersion=2.0.1

Maven 會做它應該做的一切:它將從上到下貫穿層次結構,替換所有版本 - 美! 現在剩下的就是提出 Pull Request,同事會審核更改,然後你就可以快速加入主幹了。 迅速地? 不管怎樣。 幾百個 pom.xml 供審查,這還不包括程式碼。 此外,沒有人能夠避免與如此大量的更改文件發生合併衝突。 這裡應該注意的是,在 CI 過程中,版本變更會隨著功能的變更自動發生,而不是單獨發生。

新功能

有一段時間我們平靜下來,聽天由命,我們就這樣生活,直到來自 Maven Apache 項目 從 3.5.0-beta-1 版本開始,Maven 不再支援所謂的「佔位符」。 這些替代品的本質是 pom.xml 使用變數而不是專案版本的具體指示 ${修訂}, ${sha1} и ${變更清單}。 這些屬性本身的值可以在元素中設定性能>,或者可以透過系統屬性定義它們

mvn -Drevision=2.0.0 乾淨包

系統屬性值優先於中定義的值性能>.

父母

  4.0.0
  
    org.apache
    阿帕契
    18
  
  org.apache.maven.ci
  ci-parent
  第一個 CI 友善型
  ${修訂}${sha1}${變更清單}
  ...
  
    1.3.1
    -快照
    
  


後裔

  4.0.0
  
    org.apache.maven.ci
    ci-parent
    ${修訂}${sha1}${變更清單}
  
  org.apache.maven.ci
  慈子
   ...

如果你想建立版本 2.0.0-SNAPSHOT,那麼只需使用

    mvn -Drevision=2.0.0 乾淨包

如果你想發布,那麼只需重置 SNAPSHOT

    mvn -Dchangelist=清理包

*以上例子取自 文章 在 Maven Apache 專案網站上

無情的現實

一切都很好,很健康,是時候感到滿足感了,但沒有。 事實證明,此方法不適用於安裝和部署,因為它不會在儲存庫中發布的工件的描述中被替換 ${修訂} 其含義和 maven 將不再理解它的全部內容。


    org.apache
    阿帕契
    ${修訂}

隧道盡頭的一盞燈

我們需要尋找解決問題的方法。 本來可以挽救局面 扁平化 Maven 插件。 該插件解析了 pom 中的所有變量,但同時刪除了許多其他信息,這些信息僅在組裝期間需要,而在將已發布的工件導入其他項目時不需要。 該插件還“理順”了所有父子依賴關係,因此,您將獲得一個包含您需要的所有內容的平面 pom。 不便的是,它刪除了太多的“額外”,這根本不適合我們。 在研究了這個插件的開發資訊後,我們發現我們並不是宇宙中唯一的人,早在 2018 年 1.1.0 月,就在插件儲存庫的 Github 上創建了一個拉取請求,希望使其成為可能我們自己決定如何「破壞」pom.xml。 開發人員傾聽了那些受苦者的聲音,並且在XNUMX 月份,隨著新版本XNUMX 的發布,一種新模式,resolveCiFriendliesOnly,出現在flatten-maven-plugin 中,它比以往任何時候都更合適-它留下了pom.xml 原樣,除了元素 並允許 ${修訂}, ${sha1} и ${變更清單}.

為項目新增插件


  
    org.codehaus.mojo
    扁平化 Maven 插件
    1.1.0
    
      真的
      僅解析 CiFriendlies
    
    
      
        壓扁
        流程資源
        
          壓扁
        
      
      
        展平.清潔
        乾淨的
        
          乾淨的
        
      
    
  

完成!

好結局

從現在開始,為了更改整個專案的版本並讓所有依賴項都知道它,我們只需要編輯該元素調整> 僅在根中 pom.xml。 這些具有相同更改的文件不是一百個或兩個到達審查的,而是一個。 嗯,沒必要用 版本-maven-插件.

來源: www.habr.com

添加評論