Was ist der Unterschied zwischen der Abhängigkeit vom Typ "pom" mit dem Bereich "import" und ohne "import"?

112

Ab Maven 2.0.9 besteht die Möglichkeit einzuschließen

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

in der <dependencyManagement>Sektion.

So wie ich es verstehe, wird es durch Abhängigkeiten "ersetzt", die in diesem POM enthalten sind, als ob sie ursprünglich hier definiert wären.

Was ist der Unterschied zwischen der obigen Lösung und der einfachen Abhängigkeit von diesem POM ohne importGültigkeitsbereich (ich habe gesehen, dass letzteres als "Abhängigkeitsgruppierung" bezeichnet wird)? Ist der einzige Unterschied, dass solche "gruppierten" Abhängigkeiten beim Auflösen von Abhängigkeiten Vorrang haben?

transplanthez
quelle

Antworten:

187

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

...
<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 dependencyManagementAbschnitt von definierten Abhängigkeiten im Abschnitt other-pom-artifact-idIhres POM enthalten sind dependencyManagement. Sie können diese Abhängigkeiten dann im dependencyAbschnitt Ihres POM (und aller untergeordneten POMs) referenzieren, ohne ein versionusw. einfügen zu müssen .

Wenn Sie jedoch in Ihrem POM einfach eine normale Abhängigkeit definieren, werden other-pom-artifact-idalle dependenciesaus dem dependencyAbschnitt von other-pom-artifact-idtransitiv in Ihr Projekt aufgenommen - die im dependencyManagementAbschnitt von definierten Abhängigkeiten other-pom-artifact-idwerden jedoch überhaupt nicht berücksichtigt.

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

Auf der Maven-Website gibt es eine gute Seite, die dies weitaus besser erklären kann als ich, Dependency Management in Maven, und die auch spezifische Informationen zum Importieren von Abhängigkeiten enthält .

DB5
quelle
1
Wenn pomA in übergeordnet zu pomB ist, können Sie B in das Abhängigkeitsmanagement von Projekt A mit Umfang einfügen import?
Janez Kuhar
tolle Antwort, um zu erklären, wie es funktioniert, aber warum? Warum möchten Sie die anderen Abhängigkeiten nicht transitiv einbeziehen? kannst du auch beides machen? andere-pom-Artefakt-ID importieren und dann auch andere-pom-Artefakt-ID als Abhängigkeit deklarieren?
Junchen Liu
Ein Artikel über DZone besagt etwas anderes: ... <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 und Skinny War
Coz
1
@JunchenLiu: Nehmen wir also an, Sie verwenden nur einige Funktionen von Projekt A, sodass Sie nur die transitiven Abhängigkeiten einbeziehen können, die für diese Funktion erforderlich sind. Sie können dies auch mit <Ausschluss> in <Abhängigkeit> herausfinden. Zum Beispiel checkout this: jdbi.org/#_getting_started
Nitiraj
15

Sie können ein pomTypprojekt nicht als in einem simple dependencyanderen Projekt haben. (Nun, Sie können - aber es wird nichts Nützliches tun). Es kann nur eine parent-childBeziehung geben. Dies ist im Wesentlichen managing dependency through inheritance.

importMit dem Bereich für die pomTypabhängigkeit im <dependencyManagement>Abschnitt können Sie das Äquivalent von erreichen multiple inheritance.

Sie könnten unterschiedliche Abhängigkeiten haben poms- jeweils managingeine Reihe verwandter Abhängigkeiten. Die Projekte, die diese verwenden, könnten importdiese pomsund dann die Abhängigkeiten angeben, die sie benötigen, ohne sich um die Version kümmern zu müssen. Dies ist im Wesentlichen das bill of materialsKonzept, das in den von @ DB5 angegebenen Links dargestellt wird.

Dies verhindert, dass parent pomskomplexe Projekte mit mehreren Modulen zu groß und unhandlich werden.

Raghuram
quelle
8
Bist du sicher? Ich habe reguläres POM (mit eigenen Abhängigkeiten) als reguläre Abhängigkeit in ein anderes Projekt (Packaging War) eingefügt und alle Abhängigkeiten vom POM-Projekt in WEB-INF / lib des Zielprojekts enthalten. Deshalb stelle ich diese Frage :)
Grafthez
2
Vielen Dank an @Raghuram. Ich habe völlig vergessen, die übergeordnete POM-Option bei der Beantwortung der Frage zu erwähnen. Dies ist möglich, wenn ein POM-Projekt als einfache Abhängigkeit vorliegt. Wie in der ursprünglichen Frage erwähnt, kann es verwendet werden, um Abhängigkeiten
DB5
5

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 besteht in der Verwaltung der Details und der Wiederverwendung in anderen Projekten, entweder über Vererbung ( übergeordnet ) oder Import ( Bereich ). Dies ist so, als würde man einen Datentyp im Programm deklarieren und zur Verwendung bereitstellen.

  2. Der Abhängigkeitsabschnitt 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 . Aus diesem Grund fehlen Abhängigkeiten, wenn Sie sie nur in dependencyManagment einfügen . Dies ist analog zum Instanziieren einer variablen Instanz eines Datentyps in einem Programm, in dem sie benötigt wird.

Van
quelle
Das ist gut und klar, aber es beantwortet eine andere Frage als oben. :-)
Rick-777