[英]How do I properly setup a multi-module Maven project with sliding release cycles
我正在嘗試以允許模塊的不同發布周期的方式設置我們的多模塊Apache Maven項目的最佳方法,並且在調試項目時不會引入依賴性問題。
我們目前的設置方式如下:
模塊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的標記可能會不必要地包含所有模塊子文件夾。
您的文件結構如下所示:
至於你缺少的東西,dependencyManagement不太適合管理項目內依賴項的版本。 這是聚合構建中的模塊之間的依賴關系。 它更適合聲明外部依賴項的全局版本。
我們最終使用的最終/工作解決方案與我們的開始時非常相似。 實際的項目結構保持不變:
但主要區別在於:
這使得每個模塊更加獨立,並且讓我們可以自由地發布和部署項目工件的新版本,而不用擔心。
它們看起來像是單獨的模塊。 如果它們具有不同的依賴關系,即使在多模塊項目中,通過將它們粉碎在一起會獲得什么好處?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.