web-dev-qa-db-ger.com

Was ist der Unterschied zwischen der Typabhängigkeit "pom" mit dem Gültigkeitsbereich "import" und ohne "import"?

Ab Maven 2.0.9 besteht die Möglichkeit einzubeziehen

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

in dem <dependencyManagement> Sektion.

Soweit ich weiß, wird es durch Abhängigkeiten ersetzt, die in diesem POM enthalten sind, als ob sie ursprünglich hier definiert worden wären.

Was ist der Unterschied zwischen der obigen Lösung und der einfachen Abhängigkeit von diesem POM ohne Gültigkeitsbereich import (ich habe gesehen, dass letzterer als "Gruppierung von Abhängigkeiten" bezeichnet wird)? Ist der einzige Unterschied, dass solche "gruppierten" Abhängigkeiten eine niedrigere Priorität haben, während sie den Vorrang von Abhängigkeiten auflösen?

98
grafthez

Sie können nur verwaltete Abhängigkeiten importieren . Dies bedeutet, dass Sie nur andere POMs in den Abschnitt dependencyManagement des POM Ihres Projekts importieren können . d.h.

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

Was dann passiert, ist, dass alle im Abschnitt dependencyManagement des other-pom-artifact-id Definierten Abhängigkeiten im Abschnitt dependencyManagement Ihres POM enthalten sind. Sie können dann auf diese Abhängigkeiten im Abschnitt dependency Ihres POM (und aller seiner untergeordneten POMs) verweisen, ohne dass ein version usw. eingefügt werden muss.

Wenn Sie jedoch in Ihrem POM einfach eine normale Abhängigkeit von other-pom-artifact-id Definieren, werden alle dependencies aus dem Abschnitt dependency des other-pom-artifact-id Transitiv in Ihr Projekt aufgenommen. Die im Abschnitt dependencyManagement von other-pom-artifact-id definierten Abhängigkeiten sind jedoch überhaupt nicht enthalten.

Grundsätzlich werden also die beiden unterschiedlichen Mechanismen zum Importieren/Einbeziehen der beiden unterschiedlichen Arten von Abhängigkeiten (verwaltete Abhängigkeiten und normale Abhängigkeiten) verwendet.

Es gibt eine gute Seite auf der Maven-Website, die dies viel besser erklären kann als ich. Abhängigkeitsverwaltung in Maven und sie enthält auch spezifische Informationen zu Importieren von Abhängigkeiten .

167
DB5

Sie können ein Projekt vom Typ pom nicht als simple dependency In einem anderen Projekt haben. (Nun, Sie können - aber es wird nichts Sinnvolles tun). Es kann nur eine parent-child - Beziehung geben. Dies ist im Wesentlichen managing dependency through inheritance.

import Umfang für pom Typabhängigkeit im Abschnitt <dependencyManagement> ermöglicht es Ihnen, das Äquivalent von multiple inheritance zu erzielen.

Sie könnten unterschiedliche poms haben - jedes managing eine Reihe verwandter Abhängigkeiten. Die Projekte, die diese verwenden, könnten import diese poms und dann die Abhängigkeiten angeben, die sie benötigen, ohne sich um die Version kümmern zu müssen. Dies ist im Wesentlichen das Konzept bill of materials, Das in den durch @ DB5 angegebenen Links dargestellt ist.

Dies hilft zu verhindern, dass parent poms Von komplexen Multi-Modul-Projekten zu groß und unhandlich wird.

13
Raghuram

Zwei Konzepte, die dem objektorientierten Programmierparadigma sehr ähnlich sind, helfen bei der Beantwortung der Frage:

  1. Der Abschnitt dependencyManagement deklariert nur die Abhängigkeiten und ihre Details im aktuellen Projekt. Der Zweck ist die Verwaltung der Details und die Wiederverwendung in anderen Projekten, entweder über die Vererbung ( Elternteil ) oder Import ( Umfang ). Dies ist wie das Deklarieren eines Datentyps in einem Programm und das Bereitstellen für die Verwendung.

  2. Der Abschnitt dependency definiert die tatsächliche Verwendung der Abhängigkeiten im Projekt und erbt optional die Details (dh die Version usw.). ) der unter dependencyManagment deklarierten Abhängigkeiten. Das ist der Grund, warum Sie fehlende Abhängigkeiten haben, wenn Sie sie nur in dependencyManagment einfügen. Dies ist analog zum Instanziieren einer variablen Instanz eines Datentyps in einem Programm, in dem es benötigt wird.

5
Van