2009-07-11 85 views
228

我有一個包含父項目P和三個子模塊ABC的多模塊Maven項目。 BC都是戰爭項目,都取決於AMaven模塊+構建單個特定模塊

我可以輸入Pmvn compile,並擁有所有的子模塊正確的編譯的。當我想要爲特定模塊執行操作時會出現問題。

我希望能夠爲項目B打包戰爭,但是當我從B的目錄運行包命令時,它抱怨說它無法找到A的依賴關係。

我從這個問題了解到:Maven and dependent modules或許Maven並不是真正爲這種類型的依賴關係解析設計的,但是這引出瞭如何打包B的問題?

  1. 我必須對整個項目層次上運行mvn package當我真的只是想B

  2. 我一定要A的快照安裝到我的本地庫我要打包B每一次?

A仍處於積極發展階段時,第二種情況並沒有太多樂趣。

這裏的最佳做法?

+0

[Maven和依賴模塊]的可能重複(http://stackoverflow.com/questions/808516/maven-and -dependent-modules) – oberlies 2014-01-27 12:32:28

回答

448

這裏的任何最佳實踐?

使用Maven advanced reactor options,更具體:

-pl, --projects 
     Build specified reactor projects instead of all projects 
-am, --also-make 
     If project list is specified, also build projects required by the list 

所以才cd到父P目錄,然後運行:

mvn install -pl B -am 

,這將建立B和由B所需要的模塊

6

如果您以前在項目B上運行過mvn install它將被安裝到您的本地存儲庫,因此當您構建包時Maven可以解析依賴關係。因此,只要您每次更改項目B時安裝項目B,項目A的構建都將保持最新。

您可以定義一個多模塊項目,一個聚合POM建立一整套項目。

還值得一提的是m2eclipse,它將Maven集成到Eclipse中,並允許您(可選)從工作區解析依賴關係。因此,如果您正在攻擊多個項目,則工作區內容將用於編譯。一旦您滿意您的更改,請運行mvn install(依次在每個項目上或使用聚合器)將其放入本地存儲庫。

+1

有沒有簡單的方法來保證我的目標項目的所有依賴項目都已經安裝?我的層次結構實際上比這裏描述的層次結構複雜得多,所以請記住,如果我已經爲每個依賴項目運行mvn install,因爲我上次對代碼進行了更改可能會非常棘手。 – 2009-07-11 16:28:19

+0

是的,使用模塊構建項目集合,請參閱添加到原始答案的鏈接。 – 2009-07-11 16:36:24

+0

您的多模塊項目鏈接出現404錯誤。 – 2015-06-08 05:37:34

7

Maven的絕對是專爲這種類型的依賴。

mvn package不會在您的本地系統信息庫安裝任何東西,它只是打包項目,它保留在目標文件夾。 (A)中,如果沒有任何更改,您只需要編譯/打包子模塊(B)和Maven中的所有子模塊即可將其安裝到您的計算機的Maven存儲庫中將正確使用已打包和已安裝的依賴關係。

你只需要一個mvn install父項目,如果你更新代碼的某些部分。

+2

這將是一場噩夢,在開發過程中,一旦你在子模塊中修復,你將安裝它,然後啓動servlet容器。生命是短暫的:( – hguser 2015-11-25 08:20:46

2

你說你「真的只想要B」,但這是錯誤的。你想要B,但是你也想要一個更新的A,如果它有任何改變(「積極開發」)。

因此,有時候您想與A,B和C一起工作。對於這種情況,您有聚合器項目P.對於您想要使用A和B(但不需要想要C)的情況,您應該創建聚合項目Q.

編輯2016:以上資料是在2009年作爲2016年或許是相關的,我強烈建議在大多數情況下忽略這一點,只需使用-am-pl命令行標誌爲在接受的答案中描述。如果您使用v2.1之前的maven版本,請先更改:)

+0

Grmphh ...然後我會盡可能多的聚合項目作爲項目。 – Kris 2016-07-11 20:51:44