it-swarm.com.de

Wie benutze ich POMs als Abhängigkeit in Maven?

Gibt es eine Möglichkeit, meinem POM eine Abhängigkeit vom Typ pom hinzuzufügen und alle seine Module abzurufen?

JavaMail ist ein gutes Beispiel. Maven Central Repo hat einen übergeordneten POM mit dem Namen: com.Sun.mail: all: 1.5. mit den Modulen: mail, mailapi, mailapijar, smtp, imap, gimap, pop3 und dsn.

Das Artefakt "all" hat jedoch nur eine einzige Datei: pom.xml Gibt es eine Möglichkeit, dieses "all" -Artefakt als Abhängigkeit zu meinem POM hinzuzufügen und alle seine Module abzurufen? Ich bin zu 90% sicher, dass dies nicht der richtige Weg ist, um Abhängigkeiten in Maven zu verwenden, aber ich möchte es von einem Experten für The Stack hören.

Ideen:

  • <dependencies><dependency>...<type>pom</type></dependency></dependencies>
  • <dependencyManagement><dependencies><dependency>...<type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

Verwandte: Netbeans: Maven-Abhängigkeiten vom Typ pom

30
kevinarpe

Die kurze Antwort: Sie können dies nicht in Maven tun.

Die anderen Antworten machen nur das "alles" POM zu einer Abhängigkeit. Löst das Problem nicht. Eine andere Antwort versucht, die Abhängigkeiten des "all" -POM zu importieren. Ich brauche die Abhängigkeiten nicht. Ich brauche die (Kinder-) Module des "all" POM. Auch hier löst das Problem nicht.

Randnotiz: Ich habe die JavaMail-Bibliothek falsch verwendet. Ich musste nur eine Abhängigkeit hinzufügen: com.Sun.mail: javax.mail: 1.5.

4
kevinarpe

Du musst mitgehen

<dependencies>
  <dependency>
     <groupId>com.my</groupId>
     <artifactId>commons-deps</artifactId>
     <type>pom</type>
  </dependency>
</dependencies>

Dadurch werden alle in com.my:commons-deps Deklarierten Abhängigkeiten transitiv zu Ihrem aktuellen POM hinzugefügt.

Verwenden

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

funktioniert als einfaches Einschließen von Artefaktversionen in Ihr Abhängigkeitsmanagement. Auf diese Weise wird Ihrem Projekt keine Abhängigkeit hinzugefügt.

50

Ich glaube, Sie können Ihren eigenen POM erstellen, der die gewünschten Abhängigkeiten aggregiert, und dann in Ihrem ursprünglichen Projekt eine Abhängigkeit von diesem aggregierten POM hinzufügen. Sie müssen weiterhin Abhängigkeiten zu jedem einzelnen Modul in Ihrem Abhängigkeits-POM hinzufügen, dies wird jedoch von den tatsächlichen Projekt-POMs abstrahiert und ermöglicht die Verwaltung dieser Abhängigkeiten an einem Ort. Dies kann hilfreich sein, wenn Sie am Ende mehrere Projekte haben, die davon abhängen auf dieser Menge von Abhängigkeiten.

In deinem Beispiel könntest du so einen neuen Pom erstellen:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0
                             http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>mail-deps</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <dependencies>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>mailapi</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>mailapijar</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>imap</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>gimap</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>pop3</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.mail</groupId>
            <artifactId>dsn</artifactId>
            <version>1.5.0</version>
        </dependency>
    </dependencies>
</project>

Dann fügen Sie in Ihrem ursprünglichen Projekt einfach Folgendes hinzu:

<project xmlns="http://maven.Apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0
                         http://maven.Apache.org/maven-v4_0_0.xsd">
 ...
 <modules>
   <module>src/main/Java/com/mycompany</module>
 </modules>
 ...
 <dependencies>
     <dependency>
         <groupId>com.mycompany</groupId>
         <artifactId>mail-deps</artifactId>
         <version>1.0.0</version>
         <type>pom</type>
     </dependency>
 </dependencies>
</project>
9
Chris Messina

Wenn der POM, den Sie importieren möchten, Abhängigkeiten enthält, die in einem Abschnitt <dependencies/> Definiert sind, und Sie alle importieren möchten, können Sie den folgenden Code verwenden.

(Haftungsausschluss: Ich habe dies eine Weile nicht mehr getan): Fügen Sie in Ihrem Abschnitt <dependencyManagement/> Die pom-Abhängigkeit wie folgt hinzu:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>kung.fu<groupId>
            <artifactId>ninja</artifactId>
            <version>1.2.3</version>
            <scope>import</scope>
            <type>pom</type> <!-- Not too sure if you needed this
                                  when it's scoped as import,
                                  but just in case -->
        </dependency>
    </dependencies>
</dependencyManagement>

Es kann auch sein, dass Sie die Abhängigkeit direkt im Abschnitt <dependencies/> Definieren, ohne das Bit <dependencyManagement/> Zu benötigen, aber soweit ich mich erinnere, sollte der Gültigkeitsbereich import sein. wie oben gezeigt.

1
carlspring

Wie jemand oben schon schrieb: Du kannst es nicht tun. Aber das habe ich getan und es hat funktioniert. Nehmen wir an, Sie haben eine POM-Datei (in Ihrem Beispiel JavaMail) mit folgenden Inhalten:

<type>pom</type>
<dependencyManagement><dependencies><dependency></dependencyManagement>

Und Sie möchten alle Gläser, die in diesem Artikel erwähnt werden, an eine andere Stelle kopieren. Dies ist, was ich getan habe und es ist eine schnell arbeitende Lösung
Öffne den Original-Pom und kopiere einfach alle Abhängigkeiten Abschnitte aus der Original-Pom-Datei in deinen neuen Pom wie sie sind. Verwenden Sie natürlich das Maven-Abhängigkeits-Plugin, um alle zu kopieren.

1
Oleg Kaploun