2012-08-02 218 views
71

從Maven的2.0.9起有可能包括scope「import」和「pom」類型依賴關係有什麼區別?

<type>pom</type> 
<scope>import</scope> 
<dependencyManagement>部分

據我所知,它將被包含在這個pom中的依賴關係「替換」,就像它們最初在這裏定義的一樣。

上面的解決方案和簡單的依賴這個pom沒有import範圍(我看到後者被稱爲「依賴關係分組」)有什麼區別?這種「分組」依賴關係在解決依賴關係優先級時具有較低的優先級是唯一的區別嗎?

回答

130

只能導入管理依賴。這意味着您只能將導入其他POM到項目POM的dependencyManagement部分。即

... 
<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>other.pom.group.id</groupId> 
      <artifactId>other-pom-artifact-id</artifactId> 
      <version>SNAPSHOT</version> 
      <scope>import</scope> 
      <type>pom</type> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
... 

那麼,什麼情況是,在other-pom-artifact-iddependencyManagement節中定義的所有依賴性都包含在你的POM的dependencyManagement部分。然後,您可以參考在你的POM的dependency部分這些依賴關係(及其所有子多金屬氧酸鹽),而不必包括version

但是,如果在你的POM你簡單地定義一個正常的依賴性other-pom-artifact-id那麼所有dependencies從該other-pom-artifact-iddependency部分都包含在及物動詞你的項目 - 但是在other-pom-artifact-iddependencyManagement部分定義的依賴不會被包括在內的。

所以基本上兩種不同的機制被用於導入/包括兩種不同類型的依賴關係(管理依賴性和正常的依賴關係)。

在maven網站上有一個很好的頁面,它可以解釋得這麼好,我可以,Dependency Management in Maven,它還包含importing dependencies的具體信息。

+0

如果'pom'一個在爲'pom' B的父母,你能不能把項目A的依賴管理B帶範圍'import'? – 2016-10-26 15:11:46

+0

很好的解釋它是如何工作的,但是爲什麼?爲什麼你不想過渡地包含其他依賴項?你也可以做兩個嗎?導入other-pom-artifact-id,然後聲明other-pom-artifact-id爲依賴關係? – 2016-11-11 10:15:08

+0

一篇文章上DZone規定不同的東西:'... <依賴性> $ {} project.groupId pomlib-lib的 POM 進口 $ { project.groupId} pomlib-war w AR '[DRY和Skinny戰爭(https://dzone.com/articles/dry-and-skinny-war) – coz 2017-03-29 15:34:15

11

你不能有一個pom類型的項目作爲另一個項目simple dependency。 (好吧,你可以 - 但它不會做任何有用的事情)。只能有parent-child的關係。這實質上是managing dependency through inheritance

import範圍爲pom類型依賴<dependencyManagement>部分可讓您實現相當於multiple inheritance

你可以有不同的poms - 每個managing一堆相關的依賴。使用這些項目的項目可以使用這些poms,然後指定它們所需的依賴關係,而無需擔心版本。這基本上是bill of materials的概念,在@ DB5指定的鏈接中有說明。

這有助於保持的複雜的多模塊項目parent poms過於龐大而笨重。

+5

你確定嗎?我把普通的pom(有自己的依賴關係)作爲其他項目(包裝戰爭)中的常規依賴項,並從目標項目的WEB-INF/lib中包含的pom項目獲得所有依賴項。這就是爲什麼我問這個問題:) – grafthez 2012-08-02 19:04:55

+1

謝謝@Raghuram,回答這個問題時完全忘記提及父母的POM選項。至於有一個POM類型的項目作爲一個簡單的依賴這是可能的。正如原始問題中提到的那樣,它可以用於[組依賴關係](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html) – DB5 2012-08-03 06:39:06

+1

[關於組依賴的工作鏈接](https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html#pom-relationships-sect-grouping-deps) – 2016-05-24 12:29:02

4

兩個概念,非常相似的編程範式,以面向對象的,將有助於回答這個問題:

  1. dependencyManagement節僅聲明在當前項目的依賴關係和他們的詳細資料 - 目的是的細節管理和在其他項目中再利用,或者通過繼承()或進口(範圍)。這就像在程序中聲明數據類型並使其可用。

  2. 依賴性節定義在項目中實際使用的依賴關係,任選繼承的細節(即,版本等)下的dependencyManagment聲明的依賴性。這就是爲什麼如果你只把它們放在dependencyManagment中,你將會失去依賴關係。這類似於在需要的程序中實例化數據類型的變量實例。

相關問題