簡體   English   中英

如何使用滑動釋放循環正確設置多模塊Maven項目

[英]How do I properly setup a multi-module Maven project with sliding release cycles

我正在嘗試以允許模塊的不同發布周期的方式設置我們的多模塊Apache Maven項目的最佳方法,並且在調試項目時不會引入依賴性問題。

我們目前的設置方式如下:

  • bigsystem@1.2
    • 父 - 1.1-SNAPSHOT
    • 模塊a@1.4-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供資助
    • 模塊b@1.3-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供資助
      • 取決於a@1.1
    • module c@1.1-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供資助
      • 取決於a@1.2
      • 取決於b@1.1

模塊b和c中聲明的依賴項包含編譯模塊所需的最低版本,該模塊不一定是模塊的當前版本,也不是所部署模塊的版本。

從構建角度來看,這很有效,每個模塊都可以根據需要發布/更新,但是當嘗試調試已經打開頂級pom的IntelliJ IDEA(版本8和9 EAP)下部署的應用程序時,IDEA決定,因為我們聲明了依賴於a@1.2,只要我們進入其中一個類,就應該從a-1.2-sources.jar而不是項目中當前的a@1.4源打開它。 這進一步混淆了這樣一個事實,即進入b的任何一個班級都需要我們b = 1.1而不是b@1.3。

我最初嘗試解決這個問題是在父pom的dependencyManagement部分中聲明版本號,並讓子模塊繼承該版本。 這有助於解決IDEA調試問題,因為dependencyManagement部分可以指向每個人當前的-SNAPSHOT版本。

不幸的是,由於必須在釋放模塊之前釋放父pom,因此在執行maven釋放時會出現問題,但由於父級可能引用多個開發中-SNAPSHOTS,因此無法釋放它,我們最終會添加版本引用到模塊pom以滿足發布。

似乎使用maven的dependencyManagement部分只有在我們同時發布所有bundle時才會真正起作用,無論它們是否發生了變化,但是因為我們只想在需要時管理每個子模塊的版本,這個模型不會似乎很合適。

我懷疑我遺漏了什么,並且dependencyManagement和版本范圍的組合可能滿足要求,盡管我還沒有看到版本范圍正常工作。

有沒有更好的辦法? 一個正確的方法?

我建議不要制作模塊,但要讓它們的POM獨立。 這樣您就不必擔心嘗試滿足父POM依賴項。 由於它們是獨立發布的,因此它們應該具有獨立的項目對象模型。 將Apache Commons視為模板。

我認為IDEA的問題出現是因為您在源結構中使用根POM來做兩件通常在Maven中互斥的事情。 您首先使用POM作為存儲不相關(從構建角度)Maven項目的公共配置信息的位置。 其次,您使用POM作為構建的聚合器。 您可以在不執行其他操作的情況下執行這些操作。

像Rob說的那樣,從父POM的模塊部分刪除模塊a,b等項目。 其次,將您的父POM移動到它自己的目錄中,因為它實際上是構建和發布過程中其他模塊的兄弟。 現在的方式,它更像是父/聚合器。

現在你擁有它的方式也不適合單獨標記和釋放每個模塊,因為你父POM的標記可能會不必要地包含所有模塊子文件夾。

您的文件結構如下所示:

    • 的pom.xml
  • 模塊
    • 的pom.xml
  • 模塊X.
    • 的pom.xml

至於你缺少的東西,dependencyManagement不太適合管理項目內依賴項的版本。 這是聚合構建中的模塊之間的依賴關系。 它更適合聲明外部依賴項的全局版本。

我們最終使用的最終/工作解決方案與我們的開始時非常相似。 實際的項目結構保持不變:

  • bigsystem@1.2
    • 父 - 1.1-SNAPSHOT
    • 模塊a@1.4-SNAPSHOT o由parent@1.1-SNAPSHOT提供
    • 模塊b@1.3-SNAPSHOT o由parent@1.1-SNAPSHOT提供o取決於a@1.1
    • 模塊c@1.1-SNAPSHOT o由parent@1.1-SNAPSHOT提供o取決於a@1.2 o取決於b@1.1
    • 分發a@1.2-SNAPSHOP

但主要區別在於:

  • 父模塊不包含任何版本的項目工件
  • 各個模塊完全聲明其項目依賴關系並指定版本范圍,即[1.0.0,1.1.0)
  • 所有模塊從.1開始版本號循環,即1.0.1-SNAPSHOT,這允許初始快照滿足版本范圍(1.0.0-SNAPSHOT最終早於1.0.0,因此不包括在內)。
  • 分發pom(最初未顯示有問題)標識要在特定版本中部署/包含的確切版本。
  • 在發布時從本地maven存儲庫中刪除所有項目-SNAPSHOTS,以便僅發布范圍拾取(或者使用-Dmaven.repo.local = / tmp / sometemprepo獲取新的本地存儲庫)

這使得每個模塊更加獨立,並且讓我們可以自由地發布和部署項目工件的新版本,而不用擔心。

它們看起來像是單獨的模塊。 如果它們具有不同的依賴關系,即使在多模塊項目中,通過將它們粉碎在一起會獲得什么好處?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM