2012-04-11 28 views
0

如果一個項目有許多子項目,並且所有子項目都有一個共同的父pom.xml,那麼不應該將所有的依賴項列在父pom.xml中嗎?maven子項目 - 他們是否應該有自己的依賴關係

允許子項目擁有自己的依賴關係有什麼意義..?它只是開放的可能性,一個子項目將使用apache_xyzlibrary_1.0.jar和另一個子項目可能使用_2.0.jar?

注意:所有的maven子項目組合起來形成一個webapp WAR。

回答

3

將所有項目依賴項包含到每個子項目中會非常低效,因爲這樣做會有效地爲每個子項目的構建帶來不必要的依賴關係。還有一個問題是,如果你有子項目依賴關係,即子項目a取決於子項目b,那麼你可以很容易地結束一個循環依賴關係,它無法解決。

爲了在整個項目中保持依賴項版本的一致性,maven的方法是利用項目父項目中的依賴項管理部分。因此,只需在父pom的依賴項管理部分中設置每個依賴項的版本。在子項目的pom中,只聲明瞭組Id和artefact Id。除非需要版本標記,否則不應該在子項目的pom中使用版本標記(即,當子項目需要與項目其餘部分不同的特定版本的依賴項時)。

+1

如果這種安排是標準做法,其中父pom具有完全定義的依賴關係(即包括版本號),並且子項目僅「列出」依賴關係,允許父母指定版本。 – rk2010 2012-04-11 15:42:32

+0

我同意這會很好,如果這種做法更受鼓勵,但我認爲它可能太多說它應該執行。 Maven經常提供許多完成任何事情的不同方式。如果多個項目引用不同版本的相同依賴項,我認爲構建會顯示警告,因此如果您正在做一些可能有害的事情,它們將在您的面前。 – 2012-04-12 15:32:32

0

如果所有的孩子聲明瞭相同的依賴關係,那麼最好在父代聲明這個依賴關係。你是對的,確保所有項目都使用一致的版本依賴關係。

至於爲什麼Maven開發人員決定允許在子項目中聲明依賴項?如果這樣可以使用不同版本的相同依賴項?我想他們認爲項目中本地聲明的依賴項的優勢,當它們與兄弟項目不同時,它比限制父項聲明所有子項的所有依賴項更好。

想想它就像在一個類的不同範圍聲明的變量一樣。如果你在方法中有一個私有變量,你就知道它只用於一種方法,你可以根據自己的需要改變它,而不用擔心整個代碼庫。如果你在一個類中有一個私有字段,你必須知道它在該類中的所有用法,而不是其他文件中的用法。如果你有一個公共變量,那麼你明白了。依賴關係是相同的,如果您爲單個項目聲明瞭一個項目,那麼您可以確定它只被單個項目使用/需要。此外,如果您正在構建同一家長的另一個子項目,則不需要在場。

至於你構建一個WAR,你是對的,在不同的子項目中使用不同版本的相同依賴關係可能會導致你對最終的工件感到悲傷。請注意,還有其他項目類型和構建週期,其中項目之間的混合版本號可能不是問題,實際上是需要的。

請記住,maven父母pom文件也可以有父母。這允許更多級別的層次而不僅僅是2級。如果所有的子項目都必須在頂級父項目pom文件中聲明它的依賴關係,我認爲這將是荒謬的。

+0

我不太贊同變量範圍類比。所以不是一回事。我認爲依賴關係應該是「戰爭的母親」中列出的依賴關係。 (或者「耳朵」,無論這個神器是什麼)。你怎麼看? – rk2010 2012-04-11 15:15:22

+0

@ rk2010 - 我認爲你應該把maven依賴與變量作用域相同;您可以使用範圍輕鬆確定與給定變量相關的代碼級別,並且如果要確保兩件事情使用相同的值,則需要引用相同的變量,而不是聲明兩次並允許它們可能會失去同步。至於「我認爲依賴關係應該是在戰爭的父母面前列出來的。」這就是我理解你發佈的問題的原始問題。我的回答解釋了我的想法。 – 2012-04-12 15:30:04

相關問題