Jaka jest różnica między zależnością typu „pom” z zakresem „import” i bez „import”?

112

Począwszy od Maven 2.0.9 istnieje możliwość włączenia

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

w <dependencyManagement>sekcji.

Jak rozumiem, zostanie to „zastąpione” zależnościami zawartymi w tym pomie, tak jakby były tu pierwotnie zdefiniowane.

Jaka jest różnica między powyższym rozwiązaniem a prostą zależnością do tego poma bez importzakresu (widziałem, że to drugie nazywa się „grupowaniem zależności”)? Czy jedyną różnicą jest to, że takie „zgrupowane” zależności mają niższy priorytet przy rozwiązywaniu pierwszeństwa zależności?

grafthez
źródło

Odpowiedzi:

187

Możesz importować tylko zależności zarządzane . Oznacza to, że możesz importować tylko inne pliki POM do dependencyManagementsekcji pliku POM projektu. to znaczy

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

To, co się wtedy dzieje, to to, że wszystkie zależności zdefiniowane w dependencyManagementsekcji other-pom-artifact-idsą zawarte w dependencyManagementsekcji twojego POM . Następnie możesz odwołać się do tych zależności w dependencysekcji swojego POM (i wszystkich jego podrzędnych POM) bez konieczności dołączania versionitp.

Jeśli jednak w swoim POM po prostu zdefiniujesz normalną zależność, other-pom-artifact-idto wszystkie elementy dependenciesz dependencysekcji other-pom-artifact-idzostaną włączone do twojego projektu przejściowo - jednak zależności zdefiniowane w dependencyManagementsekcji other-pom-artifact-idnie będą w ogóle uwzględnione.

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

Na stronie internetowej mavena jest dobra strona, która może to wyjaśnić znacznie lepiej niż ja, Zarządzanie zależnościami w Maven, a także zawiera szczegółowe informacje na temat importowania zależności .

DB5
źródło
1
Jeśli pomA w jest rodzicem pomB, czy możesz umieścić B w zarządzaniu zależnościami projektu A z zakresem import?
Janez Kuhar
świetna odpowiedź, aby wyjaśnić, jak to działa, ale dlaczego? dlaczego nie chcesz włączać innych zależności przejściowo? też możesz zrobić jedno i drugie? zaimportuj other-pom-artifact-id, a następnie zadeklaruj other-pom-artifact-id jako zależność?
Junchen Liu
Jeden artykuł o DZone mówi o czymś innym: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY i Skinny War
bo
1
@JunchenLiu: Powiedzmy, że używasz tylko kilku funkcji projektu A, więc możesz wybrać tylko te zależności przechodnie, które są wymagane dla tej funkcji. Możesz to rozwiązać, używając również <exclude> w <dependency>. Na przykład sprawdź
Nitiraj
15

Nie możesz mieć pomprojektu typu jako simple dependencyw innym projekcie. (Cóż, możesz - ale to nic nie da). Może istnieć tylko parent-childzwiązek. To jest zasadniczo managing dependency through inheritance.

importzakres pomzależności typu w <dependencyManagement>sekcji pozwala uzyskać odpowiednik multiple inheritance.

Możesz mieć inny poms- każdy managingzestaw powiązanych zależności. Projekty, które z nich korzystają, mogą importje pomsokreślać, a następnie określać potrzebne im zależności, bez martwienia się o wersję. Zasadniczo jest to bill of materialskoncepcja, która jest zilustrowana w linkach określonych przez @ DB5.

Pomaga to w zapobieganiu parent pomszbyt dużym i nieporęcznym projektom złożonym z wielu modułów.

Raghuram
źródło
8
Jesteś pewny? Umieściłem zwykłe pom (posiadające własne zależności) jako zwykłą zależność w innym projekcie (wojna pakowania) i otrzymałem wszystkie zależności z projektu pom zawarte w WEB-INF / lib docelowego projektu. Dlatego zadaję to pytanie :)
grafthez
2
Dzięki @Raghuram, całkowicie zapomniałem wspomnieć o opcji nadrzędnej POM podczas odpowiadania na pytanie. Jeśli chodzi o projekt typu pom jako prostą zależność, jest to możliwe. Jak wspomniano w pierwotnym pytaniu, można go użyć do grupowania zależności
DB5
5

Dwie koncepcje, bardzo podobne do paradygmatu programowania obiektowego, pomogą odpowiedzieć na pytanie:

  1. Sekcja dependencyManagement deklaruje tylko zależności i ich szczegóły w bieżącym projekcie - celem jest zarządzanie szczegółami i ponowne wykorzystanie w innych projektach poprzez dziedziczenie (element nadrzędny ) lub import ( zakres ). Jest to podobne do zadeklarowania typu danych w programie i udostępnienia go do użytku.

  2. Sekcja zależności definiuje rzeczywiste użycie zależności w projekcie, opcjonalnie dziedziczenie szczegółów (tj. Wersji itp.) Zależności zadeklarowanych w zależności od zależności . Dlatego będziesz mieć brakujące zależności, jeśli umieścisz je tylko w dependencyManagment . Jest to analogiczne do tworzenia instancji zmiennej typu danych w programie, w którym jest to potrzebne.

Awangarda
źródło
To dobre i jasne, ale odpowiada na inne pytanie niż powyższe. :-)
Rick-777