web-dev-qa-db-fra.com

Comment utiliser les POM comme dépendance dans Maven?

Existe-t-il un moyen d'ajouter une dépendance de type pom à mon POM et d'obtenir tous ses modules?

JavaMail est un bon exemple. Maven Central Repo a un POM parent appelé: com.Sun.mail: all: 1.5. avec les modules: mail, mailapi, mailapijar, smtp, imap, gimap, pop3 et dsn.

Cependant, l'artefact "all" n'a qu'un seul fichier: pom.xml Existe-t-il un moyen d'ajouter cet artefact "all" en tant que dépendance à mon POM et d'obtenir tous ses modules? Je suis sûr à 90% que ce n'est pas la bonne façon d'utiliser les dépendances dans Maven, mais je veux l'entendre d'un expert sur The Stack.

Idées:

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

Connexes: Netbeans: dépendances maven de type pom

30
kevinarpe

La réponse courte: vous ne pouvez pas faire cela à Maven.

Les autres réponses font uniquement du POM "tout" une dépendance. Ne résout pas le problème. Une autre réponse tente d'importer les dépendances du "tout" POM. Je n'ai pas besoin des dépendances; J'ai besoin des modules (enfants) du "tout" POM. Encore une fois, ne résout pas le problème.

Note latérale: J'utilisais la bibliothèque JavaMail de manière incorrecte. Je n'avais besoin d'ajouter qu'une seule dépendance: com.Sun.mail: javax.mail: 1.5.

4
kevinarpe

Vous devez aller avec

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

Cela ajoutera transitoirement toutes les dépendances déclarées dans com.my:commons-deps à votre POM actuel.

En utilisant

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

fonctionne comme une simple "inclusion" de versions d'artefacts dans votre gestion des dépendances. Ainsi, cela n'ajoutera aucune dépendance dans votre projet.

50

Je crois que vous pouvez créer votre propre POM qui agrège les dépendances que vous souhaitez, puis dans votre projet d'origine ajouter une dépendance à ce pom agrégé. Vous devrez toujours ajouter des dépendances à chaque module individuel dans votre POM de dépendance, mais il sera abstrait des POM de projet réels et permet de gérer ces dépendances en un seul endroit, ce qui pourrait devenir utile si vous finissez par avoir plusieurs projets qui dépendent sur cet ensemble de dépendances.

Dans votre exemple, vous pouvez créer un nouveau pom comme celui-ci:

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

Ensuite, dans votre projet d'origine, ajoutez simplement:

<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

Si le pom que vous essayez d'importer contient des dépendances définies dans un <dependencies/> section, et vous souhaitez tous les importer, vous pouvez essayer le code ci-dessous.

(Disclaimer: Je ne l'ai pas fait depuis longtemps): dans votre <dependencyManagement/> section, ajoutez la dépendance pom comme ceci:

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

Il se peut tout aussi bien que vous définissiez la dépendance directement dans le <dependencies/> section ne nécessitant pas le <dependencyManagement/> bit, mais pour autant que je m'en souvienne, il devrait être délimité import comme indiqué ci-dessus.

1
carlspring

Comme quelqu'un l'a déjà écrit ci-dessus: vous ne pouvez pas le faire. Mais c'est ce que j'ai fait et cela a fonctionné. Supposons que vous ayez un fichier pom (JavaMail dans votre exemple) avec les éléments suivants:

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

Et vous voulez copier tous les pots mentionnés dans ce pom à un endroit. C'est ce que j'ai fait et c'est une solution de travail rapide
Ouvrez le pom original et copiez-collez tout dépendances section du fichier pom original vers votre nouveau pom tel quel. Bien sûr, utilisez le plugin de dépendance maven pour tout copier.

1
Oleg Kaploun