wake-up-neo.com

Maven: Hinzufügen eines Verweises auf ein übergeordnetes Pom-Projekt

Ich bin mir nicht sicher, ob ich verstehe, wie man ein übergeordnetes Pom-Projekt richtig verwendet. Ich habe das folgende übergeordnete Pom definiert:

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>../child1</module>
    <module>../child2</module>
</modules>

Und dann verweisen die Kinder pom auf den Elternteil (jedes Kind hat seine eigenen Abhängigkeiten, die nicht gezeigt werden):

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../Parent/pom.xml</relativePath>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>child1</artifactId>

Dieses Setup funktioniert gut und wird in Eclipse (m2Eclipse) korrekt aufgelöst. Ich kann diese in meinem lokalen Repository bereitstellen und die folgende Struktur erhalten, die korrekt sein sollte:

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

Mein Problem ist, dass ich jetzt auf das parent -Projekt in einem different -Projekt verweisen möchte (nicht parent, child1 oder child2) und somit alle Kinder der Eltern ziehen. Ich kann in meinem anderen Projekt einen Verweis darauf hinzufügen:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>

Dabei zeigt das Projekt keine Fehler in Eclipse, aber meinem Klassenpfad werden keine Artefakte hinzugefügt: nicht child1, child2 oder ihre Abhängigkeiten.

Ich denke immer, dass es einen Weg geben muss, ein "Master" -Pom-Projekt zu haben, das kein Glas an sich ist, sondern nur Verweise auf andere Gläser enthält und dann in der Lage ist, diesen "Master" irgendwo zu referenzieren, aber ich kann nicht herausfinden, wie das funktioniert durchgeführt wird.

12
trebor

Als erstes würde ich vorschlagen, Ihre Projektstruktur zu ändern.

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

Ich würde vorschlagen, den folgenden Weg zu gehen:

  --parent (pom.xml)
      +--child1
      +--child2

Das übergeordnete Element kann in eine Versionskontrolle (Git, SVN) entweder in den Master oder in den Trunk eingecheckt werden. Abgesehen davon müssen alle Childs den Elternteil folgendermaßen referenzieren:

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>child1</artifactId>

und in deinen Eltern kannst du Dinge wie folgt verwenden:

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

Darüber hinaus können Sie ein Unternehmens-Pom einfach verwenden, indem Sie Ihrem übergeordneten Projekt eine übergeordnete Referenz hinzufügen:

<parent>
    <groupId>com.example</groupId>
    <artifactId>master-pom</artifactId>
    <version>0.0.1</version>
</parent>

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

In der Firma pom können (und sollten) Sie verschiedene Plugin-Versionen anheften und Unternehmensvorgaben und Vorschläge für Abhängigkeiten mit den entsprechenden Versionen definieren.

Wenn Sie ein Firmen-Super-Pom haben möchten, erstellen Sie einfach ein separates Maven-Projekt, das nur POM-Dateien enthält, die Ihre Konfigurationen wie Plug-Ins, Abhängigkeiten usw. enthalten, und überprüfen Sie es natürlich in einer Versionskontrolle (Git, SVN usw.). getrennt vom anderen Projekt.

Wenn Sie auf eine JAR-Datei verweisen möchten, dh auf ein Artefakt Ihres Multimodul-Builds, müssen Sie die richtige groupId, artefakt-ID und Version verwenden. Wenn Sie child1 in einem anderen Projekt verwenden möchten, müssen Sie Folgendes angeben:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>child1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

Es ist wichtig zu verstehen, dass das übergeordnete Element eines Multimodul-Builds kein Artefakt ist, das normalerweise verwendet wird, da es auf der Grundlage des Pakettyps pom nicht wirklich ein Artefakt (JAR-Datei) erstellt.

Update: Sie können dies nur eingeschränkt für den Bereich dependencyManagement mit dem scope import tun, dies ist jedoch nur für die Verwendung in depdencyManagement und nicht für Abhängigkeiten gedacht Die Lösung könnte darin bestehen, ein separates Dummy-Projekt zu erstellen, das die Abhängigkeiten zu zwei untergeordneten Elementen als transitive Abhängigkeiten aufweist. Aber das ist nicht wirklich schön.

Die Lösung besteht also einfach darin, die zwei oder mehr Abhängigkeiten direkt hinzuzufügen, die Sie in Ihrem Projekt verwenden, und das ist es.

13
khmarbaise

Erstellen Sie ein Super-Pom mit demselben Verpackungstyp und fügen Sie Ihr aktuelles Elternteil als Abhängigkeit hinzu.

0
MikeW

Wie @khmarbaise darauf hinweist, wird das übergeordnete Element eines Multimodul-Builds normalerweise nicht als Abhängigkeit an anderer Stelle verwendet. 

Sie sollten in der Lage sein, jedes Ihrer untergeordneten Module als Abhängigkeiten hinzuzufügen und durch das Hinzufügen des übergeordneten Pom zu erreichen, was Sie tun möchten. 

0
Raghuram