2012-08-02 6 views
71

Od Mavenie 2.0.9 jest możliwość włączeniaJaka jest różnica między zależnością "import" i "pom" zakresu?

<type>pom</type> 
<scope>import</scope> 

w sekcji <dependencyManagement>.

Jak rozumiem, zostanie on "zastąpiony" przez zależności zawarte w tej pompce, tak jakby były pierwotnie zdefiniowane tutaj.

Jaka jest różnica między powyższym rozwiązaniem a prostą zależnością od tej pom bez zakresu import (widziałem, że ten drugi nazywa się "grupowaniem zależności")? Czy jedyna różnica polega na tym, że takie "pogrupowane" zależności mają niższy priorytet przy rozwiązywaniu pierwszeństwa zależności?

Odpowiedz

130

Można importować tylko zarządzane zależności. Oznacza to, że możesz tylko zaimportować innych POM do sekcji POM w projekcie dependencyManagement. tj

... 
<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> 
... 

Co wtedy się dzieje, że wszystkie zależności zdefiniowane w sekcji dependencyManagement z other-pom-artifact-id są zawarte w sekcji Twojego dependencyManagement za pom. Następnie można odwołać te zależności w sekcji dependency swojej POM (i wszystkie jej POM dziecko) bez konieczności obejmują version itp

Jednak jeśli w POM wystarczy zdefiniować normalną zależność do other-pom-artifact-id wtedy wszystkie dependencies od Sekcja dependency z other-pom-artifact-id jest zawarta przejściowo w projekcie - jednak zależności zdefiniowane w sekcji dependencyManagement w other-pom-artifact-id nie są zawarte w ogóle.

W zasadzie dwa różne mechanizmy są używane do importowania/włączania dwóch różnych typów zależności (zarządzane zależności i normalne zależności).

Istnieje dobra strona na stronie internetowej maven, która może wyjaśnić to znacznie lepiej niż ja, Dependency Management in Maven i zawiera również szczegółowe informacje na temat importing dependencies.

+0

Jeśli 'pom' A in jest elementem nadrzędnym' pom' B, czy umieścisz B w zarządzaniu zależnościami projektu A od zakresu 'import'? –

+0

świetna odpowiedź, aby wyjaśnić, jak to działa, ale dlaczego? dlaczego nie chcesz przechodzić kolejnych zależności? też możesz zrobić oba? zaimportować inne-pom-artifact-id, a następnie zadeklarować również inne pom-artefakt-id jako zależność? –

+0

Jeden artykuł na DZone twierdzi coś innego: '... zależności <> $ {project.groupId} pomlib-lib pom import $ { project.groupId} pomlib-war w ar '[DRY i Skinny War] (https://dzone.com/articles/dry-and-skinny-war) – coz

11

Nie można mieć projektu typu pom jako w innym projekcie. (Cóż, możesz - ale nie zrobi nic użytecznego). Może istnieć tylko relacja parent-child. Jest to zasadniczo managing dependency through inheritance.

import zakres pom zależność typu w <dependencyManagement> sekcja pozwala osiągnąć równowartość multiple inheritance.

Możesz mieć różne poms - każdy managing garść powiązanych zależności. Projekty, które ich używają, mogą import te poms, a następnie określić zależności, których potrzebują, bez konieczności martwienia się o wersję. Jest to zasadniczo koncepcja bill of materials, która jest zilustrowana w linkach określonych przez @ DB5.

Pomaga to w utrzymaniu, że parent poms złożonych projektów wielomodułowych staje się zbyt duże i nieporęczne.

+5

Czy jesteś pewien? Ustawiłem zwykłą pom (mającą własne zależności) jako regularną zależność w innym projekcie (wojna o pakowanie) i uzyskałem wszystkie zależności od projektu pom zawartego w WEB-INF/lib projektu docelowego. Właśnie dlatego zadaję to pytanie :) – grafthez

+1

Dzięki @Raghuram, całkowicie zapomniałem wspomnieć o macierzystej opcji POM podczas odpowiadania na pytanie. Jeśli chodzi o posiadanie projektu typu pom jako prostej zależności, jest to możliwe. Jak wspomniano w oryginalnym pytaniu, można go użyć do [zależności grupowych] (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html) – DB5

+1

[ Łącze robocze dotyczące zależności grupowych] (https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html#pom-relationships-sect-grouping-deps) –

4

dwie koncepcje, bardzo podobne do programowania obiektowego paradygmatu, pomoże odpowiedzieć na pytanie:

  1. dependencyManagement sekcja deklaruje tylko współzależności i ich szczegóły w aktualnym projekcie - celem jest zarządzanie szczegóły i ponowne wykorzystanie w innych projektach, za pośrednictwem spadku (dominująca) lub importu (zakres). Jest to jak deklarowanie typu danych w programie i udostępnianie go do użytku.

  2. zależność punkt określa rzeczywiste wykorzystanie zależności w projekcie, ewentualnie dziedziczyć dane (to znaczy, wersja, etc.) według zależności deklarowanej mocy dependencyManagment. Właśnie dlatego będziesz mieć brakujące zależności, jeśli umieścisz je tylko w dependencyManagment. Jest to analogiczne do tworzenia zmiennej instancji typu danych w programie, w którym jest ona potrzebna.