web-dev-qa-db-fra.com

Les projets Maven peuvent-ils avoir plusieurs parents?

Nous avons des projets Java et flex au travail. Nous avons actuellement un pom de base contenant les configurations que nous souhaitons utiliser pour les deux projets. Le problème est que: les projets flex héritent de la configuration pour javadoc et pmd par exemple, ce qu'ils ne veulent pas.

Je veux le faire un peu plus propre et avoir un véritable pom-base, puis un pom-pom Java et un pom-pl-base-pom. Mais comment cela fonctionne-t-il dans un multimodule comportant à la fois une partie flexible et une partie Java?

Nous avons des plugins pour notre propre application où nous utilisons la structure suivante:

  • mon-plugin
    • my-plugin-client (flex)
    • my-plugin-server (Java)

Le plug-in my-plugin ne contient qu'un pom.xml avec section J'utiliserais le plugin my-plugin pom.xml comme parent pour les deux, mais je ne peux pas aussi utiliser le pom Java base ou le flex base-pom aussi comme parent Quelle serait la meilleure approche pour cela?

47
Wim Deblauwe

Un projet ne peut avoir qu'un seul parent (contrairement à l'héritage multiple en C++), mais ce parent peut faire partie d'une hiérarchie parentale plus grande. Comme l'ont souligné d'autres personnes, vous pourriez avoir quelque chose comme ceci:

 base-pom/
 | - flex-base-pom 
 | | - mon-plugin-client 
 | | `- pom.xml 
 | `-pom.xml 
 | - Java-base-pom 
 | | - my-plugin-server 
 | | `- pom.xml 
 | `- pom.xml 
 `- pom.xml 

Cela dit, j'ai remarqué que vous avez écrit que votre problème actuel est le suivant:

les projets flex héritent de la configuration pour javadoc et pmd par exemple, ce qu'ils ne veulent pas.

Vous devriez utiliser l'élément pluginManagement pour éviter cette situation:

pluginManagement est un élément visible aux côtés des plugins. Plugin Management contient les éléments du plugin de la même manière, sauf que, plutôt que de configurer les informations de plugin pour cette génération de projet particulière, il est conçu pour hériter de celui-ci. Cependant, ceci ne configure que les plugins qui sont réellement référencés dans l'élément plugins des enfants. Les enfants ont tous les droits de remplacer les définitions de pluginManagement.

Ainsi, dans le nom de famille pom, configurez vos plugins dans pluginManagement (javadoc et pmd par exemple), et faites-les référence dans l'élément plugins dans les enfants souhaités (uniquement dans my-plugin-server ici). Cela résoudrait votre problème actuel.

30
Pascal Thivent

Même si les projets Maven ont un parent unique, ils peuvent importer n'importe quel nombre d'autres pom comme ceci:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
<dependencyManagement>

Cela a deux différences importantes par rapport à un parent:

  1. Les plugins définis dans le pom importé ne seront pas importés
  2. Les dépendances définies dans le pom importé ne seront pas ajoutées au pom actuel, il importera uniquement les dépendances dans la section de gestion des dépendances  

Cependant, si votre pom parent a une section <dependencies> et que vous souhaitez les inclure dans vos dépendances, vous pouvez ajouter le parent à la section dependencies comme une dépendance normale:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

Même si la même dépendance est déjà importée, la balise de version doit être spécifiée à nouveau. Pour réduire les doublons, il peut être stocké dans une propriété

17
Peter Szanto

Le seul moyen consiste à avoir base-pom comme parent de Java-base-pom et de flex-base-pom.

J'ai une structure similaire pour mes projets de printemps:

base-pom (basic configuration - Eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)
6
David Rabinowitz

J'ai croisé ce problème exact également, et la meilleure solution que j'ai trouvée consistait à utiliser l'héritage et l'agrégation comme suggéré dans cette question: Maven prend-il en charge plusieurs parents (héritages multiples)?

Vous pouvez avoir un pom agrégateur qui n'est pas le parent des projets, il agrégats.

et expliquer dans le Documentation Maven

L'héritage et l'agrégation créent une dynamique de Nice permettant de contrôler la construction via un seul POM de haut niveau (...). À l'inverse, un projet POM peut agréger des projets qui n'en héritent pas.

De là, j’ai eu l’héritage de mes POMs (pom-master contient les configurations de communes, et chaque enfant les spécifiques):

 pom-master 
 | - pom-Java 
 | - pom-flex 

et ainsi mon projet peut obtenir les spécificités de chaque configuration de modules comme souhaité:

 projet (projet global-flex et projet-Java) 
 | - projet-Java 
 | `- pom.xml => parent = pom-Java 
 | - project-flex 
 | `- pom.xml ==> parent = pom-flex 
 `- pom.xml => parent = pom-master 

J'espère que ça va aider les autres aussi :)

4
LE GALL Benoît

Imaginez simplement que pom.xml soient en fait des classes Java: vous ne pouvez avoir qu'un seul parent (ou étendre une classe), mais ce parent peut également avoir un autre parent, etc.

Comme je l'ai expliqué ici , vous devez distinguer les principes parent et d'agrégation dans Maven, ce qui signifie que my-plugin serait considéré comme un projet d'agrégation, pas nécessairement un projet parent pour my-plugin-client et my-plugin. -parent.

Donc, pour résumer:

my-plugin définira le pom de base pour tous vos projets. Ensuite, vous créez deux nouveaux projets pom: Java-base-pom et flex-base-pom. Ils ont tous les deux my-plugin comme parent. Maintenant, my-plugin-client aura Java-base-pom comme parent, tandis que my-plugin-server utilisera flex-base-pom pour son parent.

De cette façon, my-plugin-client héritera de toutes les propriétés définies dans le my-plugin pom.xml, ainsi que du projet Java-base-pom.

2
Romain Linsolas

Vous pouvez réaliser plusieurs héritages avec des profils:

Vous créez (plusieurs) profils dans le pom racine et l'activation automatique de toute variante de ces profils permet d'obtenir plusieurs héritages de la configuration maven.

0
sibidiba