2009-10-28 5 views
40

Nous avons des projets java et flex au travail. Nous avons actuellement 1 base pom qui contient les configurations que nous voulons utiliser pour les deux projets. Problème avec ceci: les projets flex héritent de la configuration pour javadoc et pmd par exemple, ce dont ils ne veulent pas. Je veux faire ceci un peu plus propre et avoir un vrai base-pom puis un java-base-pom et un flex-base-pom. Mais comment cela fonctionne-t-il dans un multimodule qui a à la fois une partie flex et une partie java?Les projets Maven peuvent-ils avoir plusieurs parents?

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

  • mon-plugin
    • my-plugin-client (flex)
    • my-plugin-serveur (java)

Le juste mon-plugin contient une pom.xml à l'article. J'utiliserais le plugin my-plugin pom.xml comme parent pour les deux, mais je ne peux pas utiliser aussi le java base-pom ou le flex base-pom aussi comme parent. Quelle serait la meilleure approche pour cela?

Répondre

27

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

 
base-pom/ 
|-- flex-base-pom 
| |-- my-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 réel est que:

projets Flex configuration hériteront pour javadoc et PMD exemple, qu'ils ne veulent pas.

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

pluginManagement est un élément qui est vu le long plugins secondaires. La gestion des plugins contient des éléments de plugin de la même manière, sauf qu'au lieu de configurer les informations de plugin pour cette construction de projet particulière, il est prévu de configurer les builds de projet qui en héritent. 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 le droit de remplacer les définitions de pluginManagement.

Ainsi, dans la pom-mère, configurez vos plugins dans pluginManagement (javadoc et PMD par exemple), et les référencer dans l'élément plugins chez les enfants désirés (seulement dans mon-plugin-server ici). Cela résoudrait votre problème actuel.

+0

Merci pour la réponse, mais comme je l'ai dit dans un commentaire à l'autre réponse, ce n'est pas une structure que je peux utiliser. Si rien d'autre n'apparaît, pluginManagement est peut-être le seul moyen de le faire. Inconvénient est alors que je ne peux pas appliquer PMD sur tous les projets java, puisque c'est seulement dans le pluginManagement et le projet lui-même doit l'ajouter à sa propre section plugin. –

+0

Accepter cela comme réponse. Avec l'état actuel de Maven, l'utilisation de pluginManagement sera la meilleure solution. –

2

Just image que pom.xml sont 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, et ainsi de suite. Comme je l'ai expliqué here, 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éfiniront la pom de base pour tous vos projets. Ensuite, vous créez deux nouveaux projets pom: java-base-pom et flex-base-pom. Ils ont les deux my-plugin comme parent. Maintenant, my-plugin-client aura java-base-pom comme parent, alors 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 projet pom.xml my-plugin, ainsi que dans le projet java-base-pom.

+0

Peut-être que je ne me suis pas assez clair. Les poms de base devraient être à la racine de la hiérarchie, car l'application elle-même en dépend aussi, ou tout autre module java que nous construisons. C'est juste qu'à côté de cela j'ai aussi cette structure de plugin qui aurait besoin de 2 parents, mais ce n'est pas possible. –

6

La seule façon est d'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) 
+0

D'accord. Comment les parents multiples travailleraient-ils de toute façon - que se passerait-il si les deux parents avaient des propriétés conflictuelles? –

+0

L'enfant l'emporte sur le parent, si les paramètres de java-base-pom écraseront ceux de base pom, CHILD1 ceux de java-base-pom, etc. De cette façon, java-base-pom et Flex-base-pom ne sont pas liés. –

+0

J'éprouve des difficultés à faire des multiples niveaux de la hiérarchie - sur mon troisième niveau (analogue à votre ressort webapp-base_pom) la partie pluginManagement de parent s'omis tout à fait. Des idées pour lesquelles cela arrive? – Neikius

3

J'ai croisé ce problèm exact aussi, et la meilleure solution que j'ai trouvé utiliser l'héritage et l'agrégation comme suggérer dans cette question: does maven support multiple parents (multiple inheritance) ?

Vous pouvez avoir une pom aggrégateur qui n'est pas le parent de les projets agrégats.

et expliquer dans le Maven Documentation

L'héritage et l'agrégation de créer une belle dynamique pour le contrôle construit par un seul, POM de haut niveau (...) A l'inverse, un projet POM peut regrouper des projets qui font n'en hérite pas.

A partir de ce que j'ai eu mon héritage de POMs (pom-maître contient communes configurations, et chaque enfant les détails ones):

 
pom-master 
    |-- pom-java 
    |-- pom-flex 

et mon projet peut obtenir les détails pour chaque configuration des modules comme le souhaite :

 
project (aggregate project-flex & project-java) 
    |-- project-java 
    |  `-- pom.xml => parent = pom-java 
    |-- project-flex 
    |  `-- pom.xml ==> parent = pom-flex 
    `-- pom.xml => parent = pom-master 

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

+0

Salut, comment voulez-vous mettre en place le plugin maven-site-plugin et maven-release-plugin avec cette structure? – Cristiano

1

Vous pouvez obtenir plusieurs inhe ritance avec des profils:

Vous créez des profils (multiples) dans la racine pom, et activer automatiquement toute variation de ces profils permet d'obtenir plusieurs héritages de la configuration maven.

+0

Cela n'est pas idéal car les projets enfants ne peuvent pas contrôler l'activation des profils définis dans le POM parent. – GuyPaddock

7

Même si les projets de Maven ont parent seul, ils peuvent importer un certain nombre d'autres pom est comme ça:

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

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

  1. Plugins définis dans le pom importé ne sera pas importé
  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

Toutefois, si votre pom-mère a une < dépendances> section et que vous voulez inclure ceux dans vos dépendances vous pouvez ajouter le parent à la section des dépendances comme une dépendance régulière:

<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 doubles emplois, il peut être stocké dans une propriété

Questions connexes